如何通过requests.post发送消息?FunPay站点POST请求发消息失败
FunPay站点POST请求发送消息失败问题
我尝试通过POST请求在FunPay站点发送消息,但始终无法成功。我已经处于正确的页面,但消息就是发不出去。以下是我的代码实现:
print(f'{login}', lastChat['userSms']) Jurl = 'https://funpay.com/chat/?node=userId' seska = session.get(Jurl ) soup = BeautifulSoup(seska.text, 'lxml') tag1 = soup.find('div', id='live-counters').get('data-orders') tag3 = soup.find('div', class_='chat chat-float').get('data-bookmarks-tag') tag2 = soup.find("div", class_='chat chat-float').get('data-tag') tag4 = soup.find('div', class_='param-item chat-panel hidden').get('data-tag') session.get(Jurl) dataMes = soup.findAll('div', class_='message') print(dataMes[-1]) objects = '[{\"type\":\"orders_counters\",\"id\":\"5214431\",\"tag\":\"' + tag1 + '\",\"data\":false},' \ '{\"type\":\"chat_node\",\"id\":\"users-5054677-5214431\",\"tag\":\"' + tag2 + '\",' \ '\"data\":{\"node\":\"users-5054677-5214431\",\"last_message\":\"' + lastMes + '\",\"content\":\"s\"}},' \ '{\"type\":\"chat_bookmarks\",\"id\":\"5214431\",\"tag\":\"' + tag3 + '\",\"data\":false},' \ '{\"type\":\"c-p-u\",\"id\":\"5054677\",\"tag\":\"' + tag4 + '\",\"data\":false}]' request = '{\"action\":\"chat_message\",' \ '\"data\":{\"node\":\"users-5054677-5214431\",' \ '\"last_message\":\"' + lastMes + '\",\"content\":\"s\"}}' datas = { "objects": objects, "request": request, "csrf_token": csrf } print(datas) session.post(Jurl, data=datas)
问题排查与修复建议
- 请求端点错误:当前代码向页面URL发送POST请求,但FunPay的消息发送通常通过专门的AJAX接口(如
/ajax/chat.php),而非页面本身。需用浏览器开发者工具抓包确认真实请求地址。 - JSON拼接错误:手动拼接JSON字符串极易出现语法问题(引号嵌套、变量未加引号等),改用
json.dumps()生成规范JSON格式,避免格式错误。 - 硬编码ID问题:代码中
users-5054677-5214431这类ID为硬编码,应从页面动态提取(比如聊天节点的data-node属性),而非固定写死。 - 冗余请求:重复调用
session.get(Jurl)无意义,且第二次请求未更新soup,属于无效操作。 - 缺失请求头:模拟AJAX请求需添加必要请求头,比如
X-Requested-With: XMLHttpRequest和Content-Type: application/x-www-form-urlencoded,让服务器识别为合法AJAX请求。 - 未处理响应:发送POST后未打印响应内容,无法得知服务器返回的错误信息,应添加代码打印响应状态码和文本用于排查。
修改后的示例代码
import json from bs4 import BeautifulSoup print(f'{login}', lastChat['userSms']) # 替换为实际聊天页面URL,node参数填写真实用户ID chat_url = 'https://funpay.com/chat/?node=123456' response = session.get(chat_url) soup = BeautifulSoup(response.text, 'lxml') # 动态提取页面标签参数 live_counters_tag = soup.find('div', id='live-counters').get('data-orders') bookmarks_tag = soup.find('div', class_='chat chat-float').get('data-bookmarks-tag') chat_tag = soup.find('div', class_='chat chat-float').get('data-tag') cpu_tag = soup.find('div', class_='param-item chat-panel hidden').get('data-tag') # 获取最后一条消息ID,处理空列表情况 messages = soup.find_all('div', class_='message') last_message_id = messages[-1].get('data-id') if messages else '0' print(messages[-1]) # 动态生成node参数,替换为实际用户ID target_user_id = 123456 current_user_id = 5054677 node = f'users-{current_user_id}-{target_user_id}' # 用json.dumps生成正确JSON字符串 objects = [ {"type": "orders_counters", "id": "5214431", "tag": live_counters_tag, "data": False}, {"type": "chat_node", "id": node, "tag": chat_tag, "data": {"node": node, "last_message": last_message_id, "content": "你好"}}, {"type": "chat_bookmarks", "id": "5214431", "tag": bookmarks_tag, "data": False}, {"type": "c-p-u", "id": f"{current_user_id}", "tag": cpu_tag, "data": False} ] request_payload = { "action": "chat_message", "data": {"node": node, "last_message": last_message_id, "content": "你好"} } post_data = { "objects": json.dumps(objects), "request": json.dumps(request_payload), "csrf_token": csrf } print(post_data) # 添加AJAX请求头 headers = { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded' } # 发送POST到真实API端点(需抓包确认) api_response = session.post('https://funpay.com/ajax/chat.php', data=post_data, headers=headers) # 打印响应信息排查问题 print(api_response.status_code) print(api_response.text)
内容的提问来源于stack exchange,提问作者Влад Даниленко
相关产品推荐
相关产品推荐

