Avatar.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <?php
  2. namespace App\Utils;
  3. use Http;
  4. use Illuminate\Http\Client\PendingRequest;
  5. use Illuminate\Http\JsonResponse;
  6. use Illuminate\Http\Request;
  7. use Str;
  8. class Avatar
  9. {
  10. private static PendingRequest $basicRequest;
  11. public static function get(Request $request): JsonResponse
  12. {
  13. return response()->json(self::getAvatar($request->input('qq'), $request->input('username')));
  14. }
  15. private static function getAvatar(?string $qq = null, ?string $username = null): string
  16. {
  17. if ($qq) {
  18. return self::getQQAvatar($qq);
  19. }
  20. if ($username && Str::endsWith(Str::lower($username), '@qq.com')) {
  21. return self::getQQAvatar($username);
  22. }
  23. return self::getRandomAvatar($username);
  24. }
  25. public static function getQQAvatar(string $qq): ?string
  26. {
  27. self::$basicRequest = Http::timeout(15)->withUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36');
  28. $ret = null;
  29. $source = 1;
  30. while ($source <= 3 && $ret === null) {
  31. $ret = match ($source) {
  32. 1 => self::qLogo("https://q.qlogo.cn/g?b=qq&nk=$qq&s=100"),
  33. 2 => self::qZonePortrait("https://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=$qq", $qq),
  34. 3 => self::qLogo("https://thirdqq.qlogo.cn/g?b=qq&nk=$qq&s=100"),
  35. };
  36. $source++;
  37. }
  38. return $ret;
  39. }
  40. private static function qLogo(string $url): ?string
  41. {
  42. $response = self::$basicRequest->get($url);
  43. if ($response->ok()) {
  44. return $url;
  45. }
  46. return null;
  47. }
  48. private static function qZonePortrait(string $url, string $qq): ?string
  49. { //向接口发起请求获取json数据
  50. $response = self::$basicRequest->get($url);
  51. if ($response->ok()) {
  52. $message = mb_convert_encoding($response->body(), 'UTF-8', 'GBK');
  53. if (str_contains($message, $qq)) { // 接口是否异常
  54. $message = json_decode(substr($message, 17, -1), true); //对获取的json数据进行截取并解析成数组
  55. return stripslashes($message[$qq][0]);
  56. }
  57. }
  58. return null;
  59. }
  60. public static function getRandomAvatar(string $username): string
  61. {
  62. // 'https://api.sretna.cn/kind/ar.php','https://api.qjqq.cn/api/MiYouShe',
  63. // 'https://api.uomg.com/api/rand.avatar?sort=%E5%8A%A8%E6%BC%AB%E5%A5%B3&format=images','https://api.uomg.com/api/rand.avatar?sort=%E5%8A%A8%E6%BC%AB%E7%94%B7&format=images',
  64. // 'https://zt.sanzhixiongnet.cn/api.php','https://api.vvhan.com/api/avatar/dm',
  65. $apiUrls = [
  66. 'https://www.loliapi.com/acg/pp/',
  67. 'https://api.dicebear.com/9.x/thumbs/svg?seed='.$username.'&radius=50',
  68. 'https://www.cuteapi.com/api/acg/head-portrait/',
  69. 'https://api.lolimi.cn/API/dmtx/',
  70. 'https://t.alcy.cc/tx/',
  71. ];
  72. return $apiUrls[array_rand($apiUrls)];
  73. }
  74. }