借助QQ号API获取用户高清QQ头像与昵称的实用指南
在投身Typecho开发、WordPress开发,亦或是其他涉及QQ用户的项目进程中,获取用户头像这一需求极为常见。经过一番探寻,我成功找到了可获取QQ高清头像的API接口,在此迫不及待地想要分享给大家。
调用截图
一、普通头像API
普通头像的获取,可借助以下两个API地址实现:
http://q1.qlogo.cn/g?b=qq&nk=QQ号码&s=100
在实际访问这个链接时,我们以QQ号码为123456789
为例,当将其替换到链接中的QQ号码
位置后,完整链接变为http://q1.qlogo.cn/g?b=qq&nk=123456789&s=100
。通过访问此链接,便可得到该QQ号码对应的尺寸为100×100像素的普通头像。这一API接口能够稳定地提供普通尺寸的头像资源,适用于对头像清晰度要求不高,仅需快速展示头像的场景,例如一些列表页面,对头像清晰度的需求低于对加载速度的要求。http://q2.qlogo.cn/headimg_dl?dst_uin=QQ号码&spec=100
同样以QQ号码123456789
为例,替换后链接为http://q2.qlogo.cn/headimg_dl?dst_uin=123456789&spec=100
。访问该链接,同样能获取到尺寸为100×100像素的普通头像。这个API与第一个类似,都是提供普通尺寸头像的获取途径,项目开发者可以根据实际的项目架构和需求,灵活选择使用。
二、高清头像API
若期望获取高清头像,可使用如下API:http://q.qlogo.cn/headimg_dl?dst_uin=QQ号码&spec=640&img_type=jpg
。
当使用QQ号码123456789
时,链接会变成http://q.qlogo.cn/headimg_dl?dst_uin=123456789&spec=640&img_type=jpg
。访问修改后的链接,就能得到分辨率较高、细节更为丰富的高清头像,其尺寸达到640×640像素 ,格式为JPG。在项目中,若需要展示头像细节,或者在一些重要的展示区域使用头像,高清头像就显得尤为重要,这个API接口就为我们提供了这样的资源。
三、QQ昵称API(已失效)
曾经可用于获取QQ昵称的API为http://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=QQ号码
。以QQ号码123456789
为例,替换后链接为http://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=123456789
,在该API失效前,访问链接可得到对应QQ号码的昵称。但目前此接口已无法正常使用,若项目中需要获取QQ昵称,开发者需寻找其他替代方案,比如尝试通过QQ互联平台等正规渠道申请相关接口权限,以满足获取昵称的需求。
四、示例调用代码
下面为大家提供多种语言调用上述头像API的示例代码,帮助大家更好地在项目中实现头像获取功能。
Python
import requests
def get_qq_avatar(qq_number, is_high_quality=True):
if is_high_quality:
api_url = f"http://q.qlogo.cn/headimg_dl?dst_uin={qq_number}&spec=640&img_type=jpg"
else:
api_url = f"http://q1.qlogo.cn/g?b=qq&nk={qq_number}&s=100"
response = requests.get(api_url)
if response.status_code == 200:
with open(f"{qq_number}_avatar.jpg", "wb") as f:
f.write(response.content)
print(f"成功获取{'高清' if is_high_quality else '普通'}头像并保存为{qq_number}_avatar.jpg")
else:
print(f"获取头像失败,状态码:{response.status_code}")
qq_number = "123456789"
get_qq_avatar(qq_number, is_high_quality=True)
get_qq_avatar(qq_number, is_high_quality=False)
Java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class QQAvatarFetcher {
public static void getQQAvatar(String qqNumber, boolean isHighQuality) {
String apiUrl;
if (isHighQuality) {
apiUrl = String.format("http://q.qlogo.cn/headimg_dl?dst_uin=%s&spec=640&img_type=jpg", qqNumber);
} else {
apiUrl = String.format("http://q1.qlogo.cn/g?b=qq&nk=%s&s=100", qqNumber);
}
try {
URL url = new URL(apiUrl);
URLConnection connection = url.openConnection();
InputStream inputStream = connection.getInputStream();
FileOutputStream outputStream = new FileOutputStream(String.format("%s_avatar.jpg", qqNumber));
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
System.out.println(String.format("成功获取%s头像并保存为%s_avatar.jpg", isHighQuality ? "高清" : "普通", qqNumber));
} catch (IOException e) {
System.out.println(String.format("获取头像失败:%s", e.getMessage()));
}
}
public static void main(String[] args) {
String qqNumber = "123456789";
getQQAvatar(qqNumber, true);
getQQAvatar(qqNumber, false);
}
}
JavaScript(Node.js环境)
const https = require('https');
const fs = require('fs');
function getQQAvatar(qqNumber, isHighQuality) {
let apiUrl;
if (isHighQuality) {
apiUrl = `http://q.qlogo.cn/headimg_dl?dst_uin=${qqNumber}&spec=640&img_type=jpg`;
} else {
apiUrl = `http://q1.qlogo.cn/g?b=qq&nk=${qqNumber}&s=100`;
}
https.get(apiUrl, (response) => {
const filePath = `${qqNumber}_avatar.jpg`;
const fileStream = fs.createWriteStream(filePath);
response.pipe(fileStream);
fileStream.on('finish', () => {
console.log(`成功获取${isHighQuality ? '高清' : '普通'}头像并保存为${filePath}`);
});
response.on('error', (error) => {
console.log(`获取头像失败:${error.message}`);
});
});
}
const qqNumber = "123456789";
getQQAvatar(qqNumber, true);
getQQAvatar(qqNumber, false);
C
using System;
using System.IO;
using System.Net;
class Program
{
static void GetQQAvatar(string qqNumber, bool isHighQuality)
{
string apiUrl;
if (isHighQuality)
{
apiUrl = string.Format("http://q.qlogo.cn/headimg_dl?dst_uin={0}&spec=640&img_type=jpg", qqNumber);
}
else
{
apiUrl = string.Format("http://q1.qlogo.cn/g?b=qq&nk={0}&s=100", qqNumber);
}
try
{
WebRequest request = WebRequest.Create(apiUrl);
using (WebResponse response = request.GetResponse())
using (Stream inputStream = response.GetResponseStream())
using (FileStream outputStream = new FileStream($"{qqNumber}_avatar.jpg", FileMode.Create))
{
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, bytesRead);
}
}
Console.WriteLine($"成功获取{(isHighQuality ? "高清" : "普通")}头像并保存为{qqNumber}_avatar.jpg");
}
catch (Exception ex)
{
Console.WriteLine($"获取头像失败:{ex.Message}");
}
}
static void Main()
{
string qqNumber = "123456789";
GetQQAvatar(qqNumber, true);
GetQQAvatar(qqNumber, false);
}
}
PHP
<?php
function getQQAvatar($qqNumber, $isHighQuality = true)
{
if ($isHighQuality) {
$apiUrl = "http://q.qlogo.cn/headimg_dl?dst_uin={$qqNumber}&spec=640&img_type=jpg";
} else {
$apiUrl = "http://q1.qlogo.cn/g?b=qq&nk={$qqNumber}&s=100";
}
$imgData = file_get_contents($apiUrl);
if ($imgData !== false) {
$fileName = $isHighQuality ? "{$qqNumber}_high_quality_avatar.jpg" : "{$qqNumber}_avatar.jpg";
file_put_contents($fileName, $imgData);
echo "成功获取" . ($isHighQuality ? "高清" : "普通") . "头像并保存为{$fileName}<br>";
} else {
echo "获取头像失败<br>";
}
}
$qqNumber = "123456789";
getQQAvatar($qqNumber, true);
getQQAvatar($qqNumber, false);
?>
Go
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
)
func getQQAvatar(qqNumber string, isHighQuality bool) {
var apiUrl string
if isHighQuality {
apiUrl = fmt.Sprintf("http://q.qlogo.cn/headimg_dl?dst_uin=%s&spec=640&img_type=jpg", qqNumber)
} else {
apiUrl = fmt.Sprintf("http://q1.qlogo.cn/g?b=qq&nk=%s&s=100", qqNumber)
}
resp, err := http.Get(apiUrl)
if err != nil {
log.Fatalf("获取头像失败: %v", err)
}
defer resp.Body.Close()
out, err := os.Create(fmt.Sprintf("%s_avatar.jpg", qqNumber))
if err != nil {
log.Fatalf("创建文件失败: %v", err)
}
defer out.Close()
_, err = io.Copy(out, resp.Body)
if err != nil {
log.Fatalf("写入文件失败: %v", err)
}
fmt.Printf("成功获取%s头像并保存为%s_avatar.jpg\n", func() string {
if isHighQuality {
return "高清"
}
return "普通"
}(), qqNumber)
}
func main() {
qqNumber := "123456789"
getQQAvatar(qqNumber, true)
getQQAvatar(qqNumber, false)
}
Ruby
require 'net/http'
require 'uri'
def get_qq_avatar(qq_number, is_high_quality)
if is_high_quality
api_url = "http://q.qlogo.cn/headimg_dl?dst_uin=#{qq_number}&spec=640&img_type=jpg"
else
api_url = "http://q1.qlogo.cn/g?b=qq&nk=#{qq_number}&s=100"
end
uri = URI(api_url)
response = Net::HTTP.get(uri)
file_name = "#{qq_number}_#{is_high_quality ? 'high_quality_' : ''}avatar.jpg"
File.write(file_name, response)
puts "成功获取#{is_high_quality ? '高清' : '普通'}头像并保存为#{file_name}"
rescue StandardError => e
puts "获取头像失败: #{e.message}"
end
qq_number = "123456789"
get_qq_avatar(qq_number, true)
get_qq_avatar(qq_number, false)
Swift(用于iOS/macOS开发,需在合适的项目环境中运行)
import Foundation
func getQQAvatar(qqNumber: String, isHighQuality: Bool, completion: @escaping (Result<Data, Error>) -> Void) {
let apiUrl: String
if isHighQuality {
apiUrl = "http://q.qlogo.cn/headimg_dl?dst_uin=\(qqNumber)&spec=640&img_type=jpg"
} else {
apiUrl = "http://q1.qlogo.cn/g?b=qq&nk=\(qqNumber)&s=100"
}
guard let url = URL(string: apiUrl) else {
completion(.failure(NSError(domain: "Invalid URL", code: 0, userInfo: nil)))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else {
completion(.failure(NSError(domain: "No data received", code: 0, userInfo: nil)))
return
}
completion(.success(data))
}.resume()
}
let qqNumber = "123456789"
getQQAvatar(qqNumber: qqNumber, isHighQuality: true) { result in
switch result {
case .success(let data):
let filePath = "\(NSTemporaryDirectory())\(qqNumber)_high_quality_avatar.jpg"
do {
try data.write(to: URL(fileURLWithPath: filePath))
print("成功获取高清头像并保存到\(filePath)")
} catch {
print("保存高清头像失败: \(error)")
}
case .failure(let error):
print("获取高清头像失败: \(error)")
}
}
getQQAvatar(qqNumber: qqNumber, isHighQuality: false) { result in
switch result {
case .success(let data):
let filePath = "\(NSTemporaryDirectory())\(qqNumber)_avatar.jpg"
do {
try data.write(to: URL(fileURLWithPath: filePath))
print("成功获取普通头像并保存到\(filePath)")
} catch {
print("保存普通头像失败: \(error)")
}
case .failure(let error):
print("获取普通头像失败: \(error)")
}
}
上述代码在各自语言环境下,根据传入的QQ号码和是否获取高清头像的参数,从对应的API获取头像数据,并将头像保存为本地文件。在实际使用中,请确保你的环境满足相应语言和库的运行要求,同时注意处理可能出现的网络请求错误和文件操作错误。另外,由于网络环境和QQ服务器的限制,实际运行效果可能会有所不同。