QQInfo.php 1.9 KB

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