WeiboService.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?php
  2. namespace app\service;
  3. use app\middleware\Log;
  4. use think\facade\Request;
  5. use think\facade\Log as FacadeLog;
  6. class WeiboService
  7. {
  8. /**
  9. * @var mixed
  10. */
  11. public $signStr;
  12. /**
  13. * @var time
  14. */
  15. public $time;
  16. /**
  17. * @var string
  18. */
  19. private $appKey = 'h5vote';
  20. /**
  21. * @var string
  22. */
  23. private $appSecret = '8d6967d654bca47a';
  24. /**
  25. * 本类为底层微博侧相关接口请求代码示例
  26. */
  27. //@todo 切换为正式接口地址
  28. private static $base_url = 'https://ent.weibo.cn/open/wmac/';
  29. /**
  30. * @var mixed
  31. */
  32. private $uid;
  33. /**
  34. * @param $uid
  35. */
  36. public function __construct($uid = 0)
  37. {
  38. $this->uid = $uid;
  39. $this->appKey = env('weibo.api_key', 'h5vote');
  40. $this->appSecret = env('weibo.api_secret', '8d6967d654bca47a');
  41. $this->time = time();
  42. static::$base_url = env('weibo.api_host', 'https://ent.weibo.cn/open/wmac/');
  43. }
  44. /**
  45. * @param $url
  46. * @return mixed
  47. */
  48. public static function _httpGet($url = "")
  49. {
  50. $curl = curl_init();
  51. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  52. curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  53. curl_setopt($curl, CURLOPT_URL, $url);
  54. curl_setopt($curl, CURLOPT_REFERER, 'https://ent.weibo.cn'); //模拟来路
  55. curl_setopt($curl, CURLOPT_HTTPHEADER, [
  56. 'X-Forwarded-For' => get_client_ip(0),
  57. 'X-Request-Id' => Log::$logID,
  58. ]);
  59. FacadeLog::info(
  60. 'weibo_request|uri:' . $url
  61. );
  62. $start = microtime(true);
  63. $res = curl_exec($curl);
  64. $end = microtime(true);
  65. $diff = round($end, $start, 4);
  66. FacadeLog::info(
  67. 'weibo_request|spentTime:' . $diff . '|uri|' . $url . '|response:' . $res
  68. );
  69. curl_close($curl);
  70. $res = json_decode($res, true);
  71. return $res;
  72. }
  73. /**
  74. * @param $url
  75. * @param array $requestData
  76. */
  77. public static function _httpPost($url = "", $requestData = [])
  78. {
  79. $curl = curl_init();
  80. curl_setopt($curl, CURLOPT_URL, $url);
  81. curl_setopt($curl, CURLOPT_REFERER, 'https://ent.weibo.cn'); //模拟来路
  82. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  83. curl_setopt($curl, CURLOPT_HTTPHEADER, [
  84. 'X-Forwarded-For' => get_client_ip(0),
  85. 'X-Request-Id' => Log::$logID,
  86. ]);
  87. //POST数据
  88. curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($requestData));
  89. FacadeLog::info(
  90. 'weibo_request|uri:' . $url . '|params:' . json_encode(
  91. http_build_query($requestData),
  92. JSON_UNESCAPED_UNICODE
  93. )
  94. );
  95. $start = microtime(true);
  96. $res = curl_exec($curl);
  97. $end = microtime(true);
  98. $diff = round($end - $start, 4);
  99. FacadeLog::info(
  100. 'weibo_request|spentTime:' . $diff . '|uri|' . $url . '|response:' . $res
  101. );
  102. curl_close($curl);
  103. return json_decode($res, true);
  104. }
  105. //添加关注
  106. /**
  107. * @param $friends
  108. */
  109. public function add($friends)
  110. {
  111. if (env('weibo.mock') == 1) {
  112. return [
  113. 'code' => 10000,
  114. 'msg' => '操作成功',
  115. 'data' => null,
  116. ];
  117. }
  118. $url = self::$base_url . 'add' . $this->signStr;
  119. $data['uid'] = $this->uid;
  120. $data['id'] = $friends;
  121. return self::_httpPost($url, $data);
  122. }
  123. //查询关注关系
  124. /**
  125. * @param $friends
  126. */
  127. public function friends($friends)
  128. {
  129. if (env('weibo.mock') == 1) {
  130. return [
  131. 'code' => 10000,
  132. 'msg' => '操作成功',
  133. 'data' => [
  134. $friends => mt_rand(0, 1),
  135. ],
  136. ];
  137. }
  138. $url = self::$base_url . 'friends' . $this->signStr;
  139. $data['uid'] = $this->uid;
  140. $data['id'] = $friends;
  141. return self::_httpPost($url, $data);
  142. }
  143. //转发微博
  144. /**
  145. * @param $mid
  146. * @param $content
  147. */
  148. public function repost($mid, $content)
  149. {
  150. if (env('weibo.mock') == 1) {
  151. return [
  152. 'code' => 10000,
  153. 'msg' => '操作成功',
  154. 'data' => null,
  155. ];
  156. }
  157. $url = self::$base_url . 'repost' . $this->signStr;
  158. $data['uid'] = $this->uid;
  159. $data['id'] = $mid;
  160. $data['content'] = $content;
  161. return self::_httpPost($url, $data);
  162. }
  163. //给用户发放指定类型卡券
  164. /**
  165. * @param $num
  166. */
  167. public function setcoupons($num)
  168. {
  169. if (env('weibo.mock') == 1) {
  170. return [
  171. 'code' => 10000,
  172. 'msg' => '操作成功',
  173. 'data' => null,
  174. ];
  175. }
  176. $url = self::$base_url . 'setcoupons' . $this->signStr;
  177. $data['uid'] = $this->uid;
  178. $data['data'] = $num;
  179. return self::_httpPost($url, $data);
  180. }
  181. //发原创微博
  182. /**
  183. * @param $content
  184. * @param $pic_id
  185. */
  186. public function status($content, $pic_id = '')
  187. {
  188. if (env('weibo.mock') == 1) {
  189. return [
  190. 'code' => 10000,
  191. 'msg' => '操作成功',
  192. 'data' => null,
  193. ];
  194. }
  195. $url = self::$base_url . 'status' . $this->signStr;
  196. $data['uid'] = $this->uid;
  197. $data['content'] = $content;
  198. if (!empty($pic_id)) {
  199. $data['pic_id'] = $pic_id;
  200. }
  201. return self::_httpPost($url, $data);
  202. }
  203. //获取用户信息
  204. /**
  205. * @param $sub
  206. */
  207. public function userinfo($sub)
  208. {
  209. if (env('weibo.mock') == 1) {
  210. return [
  211. 'code' => 10000,
  212. 'msg' => '操作成功',
  213. 'data' => [
  214. 'uid' => mt_rand(1000, 9999),
  215. 'screen_name' => substr(md5(time()), 0, 6),
  216. 'avatar' => 'https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLZyicsRMQS6KouWddW4E0HZYfmwZNTiaE6QbgvTf5JJicvc1RsK0ibAXzDq8mOIVcK9tG9Zz1icXprY0Q/132',
  217. ],
  218. ];
  219. }
  220. $this->signStr = $this->signStr($this->time, $sub);
  221. $url = self::$base_url . 'token'. '?sign=' . $this->signStr . '&sub=' . $sub . '&time='.$this->time.'&secret=8d6967d654bca47a';
  222. return self::_httpGet($url);
  223. }
  224. /**
  225. * @param $uid
  226. */
  227. private function signStr($time, $sub)
  228. {
  229. $str = ($time>>8) . "8d6967d654bca47a" . $sub;
  230. FacadeLog::info('signStr: '.$str);
  231. return md5($str);
  232. }
  233. }