QQInfo.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace App\Utils;
  3. use Http;
  4. use Illuminate\Http\Client\PendingRequest;
  5. class QQInfo
  6. {
  7. private static PendingRequest $basicRequest;
  8. public static function getQQAvatar(string $qq): ?string
  9. {
  10. self::$basicRequest = Http::timeout(15)->withOptions(['http_errors' => false])->withUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36')->replaceHeaders(['Referer' => null]);
  11. $ret = null;
  12. $source = 1;
  13. while ($source <= 4 && $ret === null) {
  14. $ret = match ($source) {
  15. 1 => self::qLogo("https://q.qlogo.cn/g?b=qq&nk=$qq&s=100"),
  16. 2 => self::qZonePortrait("https://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=$qq", $qq),
  17. 3 => self::qLogo("https://thirdqq.qlogo.cn/g?b=qq&nk=$qq&s=100"),
  18. 4 => self::qqLogin($qq),
  19. };
  20. $source++;
  21. }
  22. return $ret;
  23. }
  24. private static function qZonePortrait(string $url, string $qq): ?string
  25. { //向接口发起请求获取json数据
  26. $response = self::$basicRequest->get($url);
  27. if ($response->ok()) {
  28. $message = mb_convert_encoding($response->body(), 'UTF-8', 'GBK');
  29. if (str_contains($message, $qq)) { // 接口是否异常
  30. $message = json_decode(substr($message, 17, -1), true); //对获取的json数据进行截取并解析成数组
  31. return stripslashes($message[$qq][0]);
  32. }
  33. }
  34. return null;
  35. }
  36. private static function qLogo(string $url): ?string
  37. {
  38. $response = self::$basicRequest->get($url);
  39. if ($response->ok()) {
  40. return $url;
  41. }
  42. return null;
  43. }
  44. private static function qqLogin(string $qq): ?string
  45. {
  46. $response = self::$basicRequest->get("https://ptlogin.qq.com/getface?imgtype=3&uin=$qq");
  47. if ($response->ok()) {
  48. $data = $response->body();
  49. if ($data) {
  50. return json_decode(substr($data, 13, -1), true)[$qq];
  51. }
  52. }
  53. return null;
  54. }
  55. }