Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Barry-Flynn opened this issue Feb 11, 2024 · 32 comments
Open

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

Barry-Flynn opened this issue Feb 11, 2024 · 32 comments

Comments

@Barry-Flynn
Copy link

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

@wutiaowu5t5
Copy link

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

@Barry-Flynn
Copy link
Author

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

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

@wutiaowu5t5
Copy link

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

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

Barry-Flynn added a commit to Barry-Flynn/python_github_calendar_api that referenced this issue Feb 21, 2024
@Barry-Flynn
Copy link
Author

嗯嗯 把你的用户名写死就可以了 。 本来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参数的值包含 = 字符或其他特殊字符,也能够正确处理。

@LYXOfficial
Copy link

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

image

@Barry-Flynn
Copy link
Author

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

image

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

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

@LYXOfficial
Copy link

我修改了一下正则才能用,原来的用不了( 修改见 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
Copy link

我修改了一下正则才能用,原来的用不了( 修改见 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已经改了 没看到(

@wutiaowu5t5
Copy link

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

@Barry-Flynn
Copy link
Author

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

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

@LYXOfficial
Copy link

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

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

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

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

@wutiaowu5t5
Copy link

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

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

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

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

是的 多了个=,

@LYXOfficial
Copy link

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

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

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

是的 多了个=,

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

@wutiaowu5t5
Copy link

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

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

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

是的 多了个=,

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

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

@Barry-Flynn
Copy link
Author

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

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

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

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

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

@Barry-Flynn
Copy link
Author

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

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

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

@LYXOfficial
Copy link

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

试试这样子改

@LYXOfficial
Copy link

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

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

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

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

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

@Barry-Flynn
Copy link
Author

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

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

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

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

@LYXOfficial
Copy link

还真是这样,现在再在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
Copy link

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

@LYXOfficial
Copy link

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

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

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

Barry-Flynn added a commit to Barry-Flynn/python_github_calendar_api that referenced this issue Mar 15, 2024
@Barry-Flynn
Copy link
Author

把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/

@LYXOfficial
Copy link

把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
Copy link

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

@Hoshino-Yumetsuki
Copy link

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

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

@LYXOfficial
Copy link

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

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

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

@Barry-Flynn
Copy link
Author

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

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

@LYXOfficial
Copy link

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

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

但是我觉得这样不如不改key-value格式,将就原来的格式就行了,直接用 #22

@Hoshino-Yumetsuki
Copy link

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

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

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

@Hoshino-Yumetsuki
Copy link

把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
Copy link

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

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

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

标点符号错误害人啊( 最后那个单引号是中文的

不,后面俩单引号都是中文(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants