kitUIN / PicImageSearch

整合图片识别 API,用于以图搜源 / Aggregator for Reverse Image Search API
https://pic-image-search.kituin.fun/
MIT License
392 stars 46 forks source link

关于百度api的建议 #29

Closed limu520 closed 2 years ago

limu520 commented 2 years ago

代码中出现的问题是,程序没有办法判断输入的内容为文件url还是文件流,导致所有的查询都是在判断为url的情况下进行查询,这也就导致了程序只能查询url图片。 在我借助作者大大所建立的类事,我发现,此类依旧可用:

import requests
import json
import sys
import re
from typing import Any, Dict, List, Optional

class BaiDuItem:
    def __init__(self, data: Dict[str, Any]):
        self.origin: Dict[str, Any] = data  # 原始数据
        self.page_title: str = data["fromPageTitle"]  # 页面标题
        self.title: str = data["title"][0]  # 标题
        self.abstract: str = data["abstract"]  # 说明文字
        self.image_src: str = data["image_src"]  # 图片地址
        self.url: str = data["url"]  # 图片所在网页地址
        self.img_list: List[str] = data.get("imgList", [])  # 其他图片地址列表

class BaiDuResponse:
    def __init__(self, resp_text: str, resp_url: str):
        self.url: str = resp_url  # 搜索结果地址
        self.similar: List[Dict[str, Any]] = []  # 相似结果返回值
        self.raw: List[BaiDuItem] = []  # 来源结果返回值
        # 原始数据
        self.origin: List[Dict[str, Any]] = json.loads(
            re.search(r"cardData = (.+);window\.commonData", resp_text)[1]  # type: ignore
        )
        self.same: Optional[Dict[str, Any]] = {}
        for i in self.origin:
            setattr(self, i["cardName"], i)
        if self.same:
            self.raw = [BaiDuItem(x) for x in self.same["tplData"]["list"]]
            info = self.same["extData"]["showInfo"]
            del info["other_info"]
            for y in info:
                for z in info[y]:
                    try:
                        self.similar[info[y].index(z)][y] = z
                    except IndexError:
                        self.similar.append({y: z})

        self.item: List[str] = [
            attr
            for attr in dir(self)
            if not callable(getattr(self, attr))
            and not attr.startswith(("__", "origin", "raw", "same", "url"))
        ]

baidu_url = "https://graph.baidu.com:443/upload?tn=pc&from=pc&image_source=PC_UPLOAD_IMAGE_FILE&"

request_file = {
    "image":('2.jpg',open(r'2.jpg','rb'))
}

aa = requests.post(baidu_url, files=request_file)

## 获取百度搜图解析网站
bb = json.loads(str(aa.text))
url = bb['data']['url']

cc = requests.post(url)
dd = BaiDuResponse(cc.text,url)

print(dd.similar)

希望对作者的改进有帮助

NekoAria commented 2 years ago

代码中出现的问题是,程序没有办法判断输入的内容为文件url还是文件流,导致所有的查询都是在判断为url的情况下进行查询,这也就导致了程序只能查询url图片。

呃,我不知道为什么会得出这个结论,我用 demo_baidu.py 测试过。

limu520 commented 2 years ago

已收到