python_github_calendar_api icon indicating copy to clipboard operation
python_github_calendar_api copied to clipboard

2024-02-11 仓库Python代码再次失效

Open Barry-Flynn opened this issue 1 year ago • 32 comments

失效代码详见 Barry-Flynn/python_github_calendar_api ,需要再次更新正则表达式

Barry-Flynn avatar Feb 11 '24 12:02 Barry-Flynn

image 我看了一下代码,发现user那个字段截取成功之后后面会莫名其妙的多了个=,导致获取为空,你只要把user改成你自己的github名字就可以了

wutiaowu5t5 avatar Feb 21 '24 07:02 wutiaowu5t5

我看了一下代码,发现user那个字段截取成功之后后面会莫名其妙的多了个=,导致获取为空,你只要把user改成你自己的github名字就可以了

那两行代码是用来截取请求路径(如 /api?Barry-Flynn )中的问号 ? 后面的用户名,我这边没有Python环境没法检查,是代码执行到图上那行时获取到的用户名有问题对吗,那我直接将代码中用户名写死成我自己的就可以了吧

Barry-Flynn avatar Feb 21 '24 08:02 Barry-Flynn

嗯嗯 把你的用户名写死就可以了 。 本来user应该是用户名的,但是莫名其妙后面多了=, 本地的py环境运行那个文件是没有问题的,我试过了。 我是直接修改仓库的代码,然后去vercel试试网页返回什么,才找到的问题 你也可以尝试一下。我现在的代码修改好了 你可以参考一下 https://github.com/wutiaowu5t5/hexo-circle-of-friends-api/blob/main/api/index.py

你想看看代码问题的话可以直接去你的仓库里面修改文件commit代码 image ranh然后去vercel里面打开你的项目 image 点击这里 然后网址链接后面拼接上/api?username就会有返回结果出来

wutiaowu5t5 avatar Feb 21 '24 09:02 wutiaowu5t5

嗯嗯 把你的用户名写死就可以了 。 本来user应该是用户名的,但是莫名其妙后面多了=, 本地的py环境运行那个文件是没有问题的,我试过了。

感谢解答!已测试,将用户名写死即可成功显示,修改后的代码片段如下:

class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 2024-02-21 固定用户名 https://github.com/Zfour/python_github_calendar_api/issues/20
        # path = self.path
        # user = path.split('?')[1]
        user = 'Barry-Flynn'
        data = getdata(user)
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(data).encode('utf-8'))
        return

问了下 GPT 之前的代码 user = path.split('?')[1] 为什么获取用户名有误,是这么回答的,但我还没测试是否可行:

如果你发现 user 的值总是多一个 = 字符,那可能是因为你的 URL 的查询字符串部分的格式并非标准的 key=value 格式,如果 user 参数是 URL 的最后一个参数,并且其值为空,浏览器或发起请求的客户端可能会在URL中为user参数附加一个 = 字符,即使没有为该参数指定值。这意味着,当你尝试获取 user 参数的值时,你实际上获取的是包含这个额外 = 字符的字符串。为了准确无误地解析 URL 中的查询参数,建议使用 Python 的 urllib.parse 模块来解析查询字符串,这样可以更准确地处理包含多个参数和复杂值的情况。下面是一个示例,展示了如何使用 urllib.parse 来解析查询参数并获取user的值:

from urllib.parse import urlparse, parse_qs
from http.server import BaseHTTPRequestHandler
import json

class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed_path = urlparse(self.path)
        query_params = parse_qs(parsed_path.query)
        user = query_params.get('user', [None])[0]  # 获取'user'参数的值,如果不存在则默认为None
        
        data = getdata(user) if user else {"error": "User parameter not provided"}
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(data).encode('utf-8'))
        return

在这个改进的版本中,urlparse(self.path) 用于解析整个 URL,而 parse_qs(parsed_path.query) 用于将查询字符串解析成一个字典,其中键是参数名,值是参数值列表。这样,即使user参数的值包含 = 字符或其他特殊字符,也能够正确处理。

Barry-Flynn avatar Feb 21 '24 10:02 Barry-Flynn

貌似写死也没有用,好像现在主页的contribution已经改成shadow-root的形式了,要抓取提交次数恐怕得用动态方式(

image

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

貌似写死也没有用,好像现在主页的contribution已经改成shadow-root的形式了,要抓取提交次数恐怕得用动态方式(

image

目前写死后是可以正常获取的,代码详见 https://github.com/Barry-Flynn/python_github_calendar_api

前端效果详见我的博客首页卡片 https://blog.meta-code.top/

Barry-Flynn avatar Mar 15 '24 07:03 Barry-Flynn

我修改了一下正则才能用,原来的用不了( 修改见 https://github.com/LYXOfficial/gitcalendarapi/blob/main/api/index.py

datadatereg = re.compile(r'data-date="(.*?)" id="contribution-day-component')
datacountreg = re.compile(r'position-absolute">(.*?) contribution')

另外 user = path.split('?')[1][:-1] 可以解决问题

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

我修改了一下正则才能用,原来的用不了( 修改见 https://github.com/LYXOfficial/gitcalendarapi/blob/main/api/index.py

datadatereg = re.compile(r'data-date="(.*?)" id="contribution-day-component')
datacountreg = re.compile(r'position-absolute">(.*?) contribution')

另外 user = path.split('?')[1][:-1] 可以解决问题

哦好像之前有个issue已经改了 没看到(

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

谢谢 稍等测试一下,不知道你有没有遇到过user打印出来后面多了个~的情况

wutiaowu5t5 avatar Mar 15 '24 07:03 wutiaowu5t5

另外 user = path.split('?')[1][:-1] 可以解决问题

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

Barry-Flynn avatar Mar 15 '24 07:03 Barry-Flynn

另外 user = path.split('?')[1][:-1] 可以解决问题

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了

不过为什么会多一个符号是个谜

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

另外 user = path.split('?')[1][:-1] 可以解决问题

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了

不过为什么会多一个符号是个谜

是的 多了个=,

wutiaowu5t5 avatar Mar 15 '24 07:03 wutiaowu5t5

另外 user = path.split('?')[1][:-1] 可以解决问题

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了 不过为什么会多一个符号是个谜

是的 多了个=,

至少可以临时解决吧 效果: https://gcapi.yisous.xyz/api?LYXOfficial

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

另外 user = path.split('?')[1][:-1] 可以解决问题

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了 不过为什么会多一个符号是个谜

是的 多了个=,

至少可以临时解决吧 效果: https://gcapi.yisous.xyz/api?LYXOfficial

我改成了你的写法,现在可以正常跑 正则的问题还没有发现 谢谢大佬 image

wutiaowu5t5 avatar Mar 15 '24 07:03 wutiaowu5t5

另外 user = path.split('?')[1][:-1] 可以解决问题

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了

不过为什么会多一个符号是个谜

如果想要用标准点的 key value 形式调用该 GET 接口,即 API 参数为 ?user=Barry-Flynn,这个Python 代码如何改进呢,因为总感觉当前直接将用户名放在问号后面的方式很不规范

Barry-Flynn avatar Mar 15 '24 07:03 Barry-Flynn

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了,不过为什么会多一个符号是个谜

会不会就是因为它不是标准的 key value 形式 GET 接口,导致将调用地址后面的参数 ?Barry-Flynn 认为成了参数名,从而自动补全成了 ?Barry-Flynn=,所以导致截取到问号后面多了一个等号。改成 ?user=Barry-Flynn 的调用方式应该就能解决问题

Barry-Flynn avatar Mar 15 '24 07:03 Barry-Flynn

path=self.path[:-1]
spl=path.split('?')[1:]
for kv in spl:
    key,user=kv.split("=")
    if key=="user": break

试试这样子改

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

user = path.split('?')[1] 改为 user = path.split('?')[1][:-1] 可以解决自定义用户名失效的问题是吗?

不是莫名其妙多了个等号么,在切片的时候就不取最后一个字符就好了,不过为什么会多一个符号是个谜

会不会就是因为它不是标准的 key value 形式 GET 接口,导致将调用地址后面的参数 ?Barry-Flynn 认为成了参数名,从而自动补全成了 ?Barry-Flynn=,所以导致截取到问号后面多了一个等号。改成 ?user=Barry-Flynn 的调用方式应该就能解决问题

好像很有道理,很有可能是vercel添加了一些机制自动补全

不过只有一个参数的时候真没必要key-value吧(

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

会不会就是因为它不是标准的 key value 形式 GET 接口,导致将调用地址后面的参数 ?Barry-Flynn 认为成了参数名,从而自动补全成了 ?Barry-Flynn=,所以导致截取到问号后面多了一个等号。改成 ?user=Barry-Flynn 的调用方式应该就能解决问题

好像很有道理,很有可能是vercel添加了一些机制自动补全

不过只有一个参数的时候真没必要key-value吧(

但确实看着难受【笑哭】各大搜索引擎的搜索接口也就一个关键字参数,也用标准键值对传参的嘛

Barry-Flynn avatar Mar 15 '24 07:03 Barry-Flynn

还真是这样,现在再在vercel访问api后面得加一个字符才行了 那就这样改:

path=self.path
spl=path.split('?')[1:]
for kv in spl:
    key,user=kv.split("=")
    if key=="user": break

见: https://github.com/LYXOfficial/gitcalendarapi/blob/main/api/index.py https://gcapi.yisous.xyz/api?user=lyxofficial

LYXOfficial avatar Mar 15 '24 07:03 LYXOfficial

然而现在又要去改hexo插件源码了啊emm

LYXOfficial avatar Mar 15 '24 08:03 LYXOfficial

把gitcalendar-js.pug 有var apiurl的一行改为:

var apiurl = '!{theme.gitcalendar.apiurl}' ? 'https://!{theme.gitcalendar.apiurl}/api?user=' : ‘https://gcapi.yisous.xyz/api?user=’

如果改的时候是直接装的node插件的话就得改了重新打包发包了qwq

LYXOfficial avatar Mar 15 '24 08:03 LYXOfficial

把gitcalendar-js.pug 有var apiurl的一行改为:

var apiurl = '!{theme.gitcalendar.apiurl}' ? 'https://!{theme.gitcalendar.apiurl}/api?user=' : ‘https://gcapi.yisous.xyz/api?user=’

如果改的时候是直接装的node插件的话就得改了重新打包发包了qwq

适配新版 Python 接口的前端 Hexo 插件依赖包已发布,如若迁移可见 https://github.com/Barry-Flynn/hexo-github-calendar/

Barry-Flynn avatar Mar 15 '24 13:03 Barry-Flynn

把gitcalendar-js.pug 有var apiurl的一行改为:

var apiurl = '!{theme.gitcalendar.apiurl}' ? 'https://!{theme.gitcalendar.apiurl}/api?user=' : ‘https://gcapi.yisous.xyz/api?user=’

如果改的时候是直接装的node插件的话就得改了重新打包发包了qwq

适配新版 Python 接口的前端 Hexo 插件依赖包已发布,如若迁移可见 https://github.com/Barry-Flynn/hexo-github-calendar/

hhh我是手动魔改的,但是确实重新发一个包很方便(

LYXOfficial avatar Mar 15 '24 13:03 LYXOfficial

我把之前那个没有改格式的更改提交pr了(https://github.com/Zfour/python_github_calendar_api/pull/22

LYXOfficial avatar Mar 15 '24 13:03 LYXOfficial

我把之前那个没有改格式的更改提交pr了(#22

其实根本不需要改本地插件 image

Hoshino-Yumetsuki avatar Mar 15 '24 14:03 Hoshino-Yumetsuki

我把之前那个没有改格式的更改提交pr了(#22

其实根本不需要改本地插件 image

好像很有道理啊,但是改了本地插件更合理一些是吧,免得后面有天不知道莫名其妙的user=是干嘛的(

LYXOfficial avatar Mar 15 '24 14:03 LYXOfficial

其实根本不需要改本地插件 image

你这样前端卡片的“数据来源”就变成了 user=用户名 了,太难看了。前后端全部改成标准 key-value 格式调用后,新版后端 Barry-Flynn/python_github_calendar_api 的扩展性也更强,其他第三方项目调用该GET接口也能更好适配

Barry-Flynn avatar Mar 15 '24 14:03 Barry-Flynn

我把之前那个没有改格式的更改提交pr了(#22

其实根本不需要改本地插件 image

但是我觉得这样不如不改key-value格式,将就原来的格式就行了,直接用 https://github.com/Zfour/python_github_calendar_api/pull/22

LYXOfficial avatar Mar 15 '24 14:03 LYXOfficial

其实根本不需要改本地插件 image

你这样前端卡片的“数据来源”就变成了 user=用户名 了,太难看了。前后端全部改成标准 key-value 格式调用后,新版后端 Barry-Flynn/python_github_calendar_api 的扩展性也更强,其他第三方项目调用该GET接口也能更好适配

是这样( 我用的也是LYX魔改的butterfly,一开始找不到魔改的代码在哪就直接改成user=了,现在找到了就改代码好了(

Hoshino-Yumetsuki avatar Mar 15 '24 14:03 Hoshino-Yumetsuki