chatpdf 如何调用自己的api (chatpdf的api开发)

在小编体验过众多的继续大模型的论文阅读助手,以及各类的小型知识库的搭建项目后。

ChatPDF,是真实测试反馈效果最好的一个。

什么是ChatPDF?

众所周知,ChatGPT是对输入提问字数有限制的。那么如果我想要把一篇论文或者一个公司内部的规则输入给ChatGPT,然后基于这些内容,做一个问答系统,怎么实现呢?

ChatPDF应运而生!

ChatPDF是使⽤类似(langchain)库从PDF⽂件中提取信息, 并借助OpenAI的GPT模型回答关于⽂本内容的问题。这个过程将帮助你轻松地从⼤量文档中获取有价值的信息。

chatpdf的api开发,chatpdf如何调用自己的api

但是比较令人苦恼的是,ChatPDF只能在网页版使用,如果想对接其它的应用,或者是打造一个微信的对话机器人,都是不可以的。而且ChatPDF的官方的API是很难申请下来的。目前甚至暂时已经关闭了API的申请入口了。

那我们就彻底没办法了吗?当然不能直接放弃,下面博主分享一个“奇技淫巧”的解决方案。

思路:

首先:通过抓包分析可以看到在ChatPDF的所有请求中是一定要带着chatpdf-idtoken这个字段的。

chatpdf的api开发,chatpdf如何调用自己的api

这个字段是基于JWT的,JWT 的模拟登录思路也比较清晰了,由于JMT 的字符串就是用户访问的凭证,所以模拟登录只需要做到下面几步。

第一步,模拟网站登录操作的请求。比如拿着用户名和密码信息请求登录接口,获取服务器返回的结果,这个结果中通常包含JWT字符串的信息,将它保存即可。

第二步,后续的请求携带JWT 进行访问。在JWT不过期的情况下,通常能正常访问和执行对应的操作。携带方式多种多样,因网站而异。

第三步,如果JWT过期了,可能需要再次进行第一步,重新获取JWT。

但是问题来了。这个网站的模拟登录是只能通过谷歌登录的,而谷歌登录的JWT又比较难以实现。

就转而通过指纹浏览器去实现登录。登录后,再通过Mitmproxy去监控selenium获取请求的请求头中的chatpdf-idtoken,然后就可以正常请求,自己封装一个API了。

具体实施

vmlogin指纹浏览器创建和配置

正常创建配置文件

并且保证自己的监听端口开放。

chatpdf的api开发,chatpdf如何调用自己的api

Mitmproxy代理设置和证书安装

首先:pip install mitmproxy

安装成功后在Python\Scripts的目录下生成下面三个程序,然后将 mitmproxy加入系统环境变量。

chatpdf的api开发,chatpdf如何调用自己的api

pc端Mitmproxy代理设置

1、Mitmproxy默认端口是8080,如果8080端口被占用,可以进行以下命令进行修改:

mitmproxy -p 指定的端口号

由于windows系统不支持mitmproxy,修改windows的端口号,可以使用mitmdump或者mitmweb来代替mitmproxy,命令如下:

mitmdump -p 指定的端口号

mitmweb -p 指定的端口号

2、打开浏览器,我这里使用时chrome浏览器,并装上了SwitchyOmega工具,打开SwitchyOmega工具,如图:

chatpdf的api开发,chatpdf如何调用自己的api

SwitchyOmega*载下**地址:https://github.com/FelisCatus/SwitchyOmega/releases

3.点击新建情景模式,并输入情景模式的名称,如图:

chatpdf的api开发,chatpdf如何调用自己的api

4、点击创建按钮,跳转到mitmproxy配置界面,如图:

chatpdf的api开发,chatpdf如何调用自己的api

5、在mitmproxy配置界面,选择HTTP代理协议,然后根据自己的IP地址和端口号进行填写,点击应用选项,我这里就是用本地的IP地址和默认的端口号,如图:

chatpdf的api开发,chatpdf如何调用自己的api

6、在浏览器的扩展程序中选中mitmproxy代理就行了,如图:

chatpdf的api开发,chatpdf如何调用自己的api

这样mitmproxy的代理就设置完成了,不过这样只能抓取http协议,而不能抓取https协议,抓取https需要安装证书,接下来开始证书的安装!

pc端证书安装

1、打开终端,输入mitmdump,开启监听端口,浏览器设置为mitmproxy代理,如图

chatpdf的api开发,chatpdf如何调用自己的api

2、进入mitm.it界面进行对应的系统的证书*载下**,我这里是windows,所以选择如下图:

chatpdf的api开发,chatpdf如何调用自己的api

2、双击*载下**的证书mitmproxy-ca-cert.p12,进入证书导入向导界面,选择本地计算机,如图:

chatpdf的api开发,chatpdf如何调用自己的api

3、点击下一步,进入以下界面,如图:

chatpdf的api开发,chatpdf如何调用自己的api

4、点击下一步,不输入密码,如图所示:

chatpdf的api开发,chatpdf如何调用自己的api

5、点击下一步,进入证书储存界面,选择将所有的证书都放入下列存储,点击浏览按钮,选择受信任的根证书颁发机构,如图所示:

chatpdf的api开发,chatpdf如何调用自己的api

6、点击下一步,跳转到正在完成证书导入向导界面,如图:

chatpdf的api开发,chatpdf如何调用自己的api

7、点击完成按钮,弹出导入成功弹窗,点击确定按钮就完成了证书的安装

8、验证证书,抓取https的数据请求,至此,pc端的代理和证书已经设置成功

创建mysql数据库

记录chatpdf-idtoken字段。

python代码

#!/usr/bin/env python3
# * coding: utf-8 _*_
import json
import re
from mitmproxy import ctx
import pymysql
mysql_config = {
'host': '127.0.0.1',
'user': 'root',
'password': 'root',
'db': 'baijiahao',

}
mysql_conn = pymysql.connect(host=mysql_config['host'],
user=mysql_config['user'],
passwd=mysql_config['password'],
db=mysql_config['db'],
charset='utf8mb4',
)
cursor = mysql_conn.cursor()
class zhihu:

def response(self, flow):
# 提取请求的 url 地址
request_url = flow.request.url

# 通过字符串,过滤出请求和返回数据
if bool(re.search(r"XXXXXXXXXXXX", request_url)):
print("request_url >>> ", request_url)
request_headers=flow.request.headers
# ctx.log.info(str(request_headers))
# link_data = data['Headers']
# for link in link_data:
# lasthead=link['chatpdf-idtoken']
# with open('search_uid_log.txt', 'a+', encoding='utf8') as f:
# f.writelines(str(lasthead))
data=str(request_headers)

addons = [
zhihu()
]

然后CMD

打开指纹浏览器,创建配置文件,安装好浏览器插件,启动代理代理模式。将python代码里面的XXXXX改为你想要监控的url。

然后运行

mitmdump -s xxxx.py

至此,就可以监控浏览器的数据了。

操作浏览器不断刷新

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import json
import time

def getck():
    mla_profile_id = 'XXXXX'
    mla_url = 'http://127.0.0.1:35000/api/v1/profile/start?skiplock=true&profileId=' + mla_profile_id
    resp = requests.get(mla_url)
    json = resp.json()
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", json['value'][7:])
    chrome_driver = r"chromedriver*ex.e**"
    # http://chromedriver.storage.googleapis.com/92.0.4515.107/chromedriver_win32.zip
    driver = webdriver.Chrome(chrome_driver, options=chrome_options)
    driver.get('https://www.chatpdf.com/c/Cst9AnKRFSxN0epw2a7Xh')
    while True:
        driver.refresh()
        time.sleep(40)
getck()

浏览器一直刷新,就会让chatpdf-idtoken一直更新,带着chatpdf-idtoken就可以随便操作ChatPDF了。

大家有更好的解决方案也欢迎留言给博主。