Skip to content

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

Open

Description

@Barry-Flynn

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

Activity

  1. wutiaowu5t5 commented on Feb 21, 2024

    @wutiaowu5t5

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

  2. Barry-Flynn commented on Feb 21, 2024

    @Barry-Flynn
    Author

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

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

  3. wutiaowu5t5 commented on Feb 21, 2024

    @wutiaowu5t5

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

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

  4. added a commit that references this issue on Feb 21, 2024
  5. Barry-Flynn commented on Feb 21, 2024

    @Barry-Flynn
    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参数的值包含 = 字符或其他特殊字符,也能够正确处理。

  6. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

    image

  7. Barry-Flynn commented on Mar 15, 2024

    @Barry-Flynn
    Author

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

    image

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

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

  8. LYXOfficial commented on Mar 15, 2024

    @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] 可以解决问题

  9. LYXOfficial commented on Mar 15, 2024

    @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已经改了 没看到(

  10. wutiaowu5t5 commented on Mar 15, 2024

    @wutiaowu5t5

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

  11. Barry-Flynn commented on Mar 15, 2024

    @Barry-Flynn
    Author

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

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

  12. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

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

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

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

  13. wutiaowu5t5 commented on Mar 15, 2024

    @wutiaowu5t5

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

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

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

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

    是的 多了个=,

  14. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

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

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

    是的 多了个=,

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

  15. wutiaowu5t5 commented on Mar 15, 2024

    @wutiaowu5t5

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

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

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

    是的 多了个=,

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

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

  16. 4 remaining items

  17. Barry-Flynn commented on Mar 15, 2024

    @Barry-Flynn
    Author

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

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

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

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

  18. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

  19. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

  20. LYXOfficial commented on Mar 15, 2024

    @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

  21. added a commit that references this issue on Mar 15, 2024
  22. Barry-Flynn commented on Mar 15, 2024

    @Barry-Flynn
    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/

  23. LYXOfficial commented on Mar 15, 2024

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

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

  24. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

  25. Hoshino-Yumetsuki commented on Mar 15, 2024

    @Hoshino-Yumetsuki

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

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

  26. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

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

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

  27. Barry-Flynn commented on Mar 15, 2024

    @Barry-Flynn
    Author

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

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

  28. LYXOfficial commented on Mar 15, 2024

    @LYXOfficial

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

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

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

  29. Hoshino-Yumetsuki commented on Mar 15, 2024

    @Hoshino-Yumetsuki

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

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

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

  30. Hoshino-Yumetsuki commented on Mar 15, 2024

    @Hoshino-Yumetsuki

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

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

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

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

  31. LYXOfficial commented on Mar 16, 2024

    @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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions