如默 发表于 2024-11-5 13:49:27

pushdeer发送markdown错误

如题,在使用pushdeer的时候,发现了如下的问题,先附上代码:
import os
from dotenv import load_dotenv
from pypushdeer import PushDeer
from datetime import datetime
import json
import requests

# 加载 .env 文件
load_dotenv()

# 读取配置文件
with open("config.json", "r", encoding="utf-8") as f:
    config = json.load(f)

def httpGet(url, params):
    try:
      response = requests.get(url, params=params)
      response.raise_for_status()# 检查请求是否成功
      return json.loads(response.content)# 返回 JSON 解析后的内容
    except requests.exceptions.RequestException as e:
      print(f"GET 请求失败: {e}")
      return {"success": False, "message": str(e)}
    except json.JSONDecodeError as e:
      print(f"JSON 解析失败: {e}")
      return {"success": False, "message": str(e)}


# 获取抖音热点热榜
def getDouyinHot():
    url = "https://api.vvhan.com/api/hotlist/douyinHot"
    response = httpGet(url, {"type": "json"})
    if response.get("success"):
      data = response.get("data")
      douyinHotList = []
      douyinHot = ""
      for item in data:
            index = item["index"]
            title = item["title"]
            url = item["mobil_url"]
            douyinHotListItem = f"{index}. [{title}]({url})"
            douyinHotList.append(douyinHotListItem)
            douyinHot = "\n".join(douyinHotList)
      return douyinHot
    else:
      print("抖音热榜获取失败")
      return ""



# 获取服务器地址和 pushkeys
server = os.getenv("SERVER")
gaoDeKey = os.getenv("GAODE_KEY")
# pushkeys = os.getenv("PUSHKEYS", "").split(",")
pushkey = os.getenv("PUSH_KEY")


# 获取对应方法返回的数据
today = datetime.now().strftime("%Y年%m月%d日")
douyinHotList = getDouyinHot()



def main():
    print(type(douyinHotList))
    print(douyinHotList)
    global pushkey# 声明使用全局变量
    pushkey = pushkey.strip()# 去除可能存在的前后空格
    # 初始化 PushDeer 对象
    pushdeer = PushDeer(server=server, pushkey=pushkey)
    # 发送消息
    try:
      response = pushdeer.send_markdown(f"{today}抖音热榜", desp=douyinHotList)
      print("消息发送成功:", response)
    except Exception as e:
      print("消息发送失败:", e)



if __name__ == "__main__":
    main()


运行之后,douyinHotList打印出来是没问题的,有东西,类型也是str,就是发送的这一句,response = pushdeer.send_markdown(f"{today}抖音热榜", desp=douyinHotList)报错,消息发送失败: Expecting value: line 1 column 1 (char 0)

之前用这个pushdeer.send_markdown一点问题都没有,直接发送markdown的图片和链接都可以,这次不知道为什么,大佬帮忙看看

FishC 发表于 2024-11-5 14:03:07

根据您的描述,`response = pushdeer.send_markdown(f"{today}抖音热榜", desp=douyinHotList)`这行代码出现了错误,提示信息是“Expecting value: line 1 column 1 (char 0)”。这是一个经典的JSON解析错误,通常表示服务器返回了一个空响应或者不合法的JSON格式,从而无法解析。

以下是一些可能导致问题以及解决方法的检查点:

1. **API返回数据检查**:确保API `https://api.vvhan.com/api/hotlist/douyinHot`返回的数据是有效的JSON格式,您可以通过直接访问此URL查看返回内容来排除API问题。

2. **PushDeer服务检查**:检查PushDeer的服务器地址、密钥等配置是否正确,并确保PushDeer服务正常工作。可以通过其他简单的测试消息验证推送服务。

3. **空响应排查**:在发生请求错误的时候,打印`response.content`,检查返回是否为空或者非JSON格式:

   try:
       response = pushdeer.send_markdown(f"{today}抖音热榜", desp=douyinHotList)
       print("消息发送成功:", response)
   except Exception as e:
       print("消息发送失败:", e)
       if hasattr(e, 'response') and e.response is not None:
         print("返回内容:", e.response.text)

4. **douyinHotList的内容问题**:确保`douyinHotList`的内容是正确格式的字符串。可以在调试时打印它以确认格式是否存在问题。

5. **异常捕获范围**:可能需要增加对其他特定异常的捕获,帮助了解错误的详细信息:

   except Exception as e:
       print("消息发送失败:", e)

通过这些步骤来诊断和解决问题。如果问题依然存在,可以尝试本地测试PushDeer接口以确保其服务无误,然后根据API返回的数据进一步修正代码逻辑。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

如默 发表于 2024-11-5 14:08:26

好像找到问题了,附上测试的代码:
import requests
from utils import getDouyinHot


def send_pushdeer_notification(pushkey, title, markdown_content):
    # 构建请求URL
    url = "https://api2.pushdeer.com/message/push"
    params = {
      "pushkey": pushkey,
      "text": title,
      "desp": markdown_content,
      "type": "markdown",
    }

    try:
      # 发起GET请求
      response = requests.get(url, params=params)
      # 检查响应状态码
      response.raise_for_status()

      # 打印响应内容
      print(response.json())

    except requests.exceptions.RequestException as e:
      # 打印异常信息
      print(f"请求失败: {e}")
    except ValueError as e:
      # JSON解码失败,打印响应文本以便调试
      print(f"无法解析JSON响应: {response.text}")


# 示例用法
douyinHotList = getDouyinHot()
pushkey = "xxx"
title = "抖音热榜"
markdown_content = douyinHotList

send_pushdeer_notification(pushkey, title, markdown_content)


报错是请求失败: 414 Client Error: Request-URI Too Long for url: https://api2.pushdeer.com/message/push?

这是官方版本,哎,内容太长了

FishC 发表于 2024-11-5 14:08:45

如默 发表于 2024-11-05 14:08
好像找到问题了,附上测试的代码:
import requests
...

`414 Client Error: Request-URI Too Long` 错误通常表示URL或GET请求的参数太长,从而超出了服务器可以处理的限制。PushDeer的API可能对请求长度有限制。

解决方法是改用POST请求而不是GET请求,因为POST请求可以处理更长的内容体。下面是将请求方式从GET改为POST的示例代码:

import requests
from utils import getDouyinHot

def send_pushdeer_notification(pushkey, title, markdown_content):
    # 构建请求URL
    url = "https://api2.pushdeer.com/message/push"
    payload = {
      "pushkey": pushkey,
      "text": title,
      "desp": markdown_content,
      "type": "markdown",
    }

    try:
      # 发起POST请求
      response = requests.post(url, data=payload)
      # 检查响应状态码
      response.raise_for_status()

      # 打印响应内容
      print(response.json())

    except requests.exceptions.RequestException as e:
      # 打印异常信息
      print(f"请求失败: {e}")
    except ValueError as e:
      # JSON解码失败,打印响应文本以便调试
      print(f"无法解析JSON响应: {response.text}")

# 示例用法
douyinHotList = getDouyinHot()
pushkey = "xxx"
title = "抖音热榜"
markdown_content = douyinHotList

send_pushdeer_notification(pushkey, title, markdown_content)

通过使用POST请求,数据不会放在URL中,而是作为报文体传递,通常能够解决URI过长的问题。希望这能帮助您解决问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

OKMY 发表于 2024-11-5 18:15:13

5

trinityee 发表于 2024-11-7 08:38:48

{:10_254:}{:10_254:}

ydwb 发表于 2024-11-10 09:15:05

666

XiaoMengXin-1 发表于 2024-11-12 08:06:27

111
页: [1]
查看完整版本: pushdeer发送markdown错误