这个东西思路简单,但实现也是耗费了一整天时间,毕竟你不知道哪里问题会突然跳出来,做完眼都花了。
我想从大概三个方面总结一下:存储、请求和实现流程。先说思路,再说过程。
存储
存储一直是个很麻烦的事情,先前照片存储就折腾了很久,又是图床又是加速,最终效果也不好(当然,你既然想要啥都免费了,就不能又要又要的)。
而这次不同先前,不光要存储和读取,还要能修改写入,不然得到了ip也没有用,所以静态存储已经不能满足我们的需要了。
我始终没有找到免费的国内云端数据库,所以用的还是github——哎?等等,不是静态存储已经不能……
没错,我们要用github存储和读取,并在网页客户端频繁更改。
新建一个仓库,放入一个你要存储的空文件,在个人页面生成一个拥有修改此文件权限的token。(我英语不好,之前以为token全局生效,为了避免其他仓库数据泄露风险选择了用另一个邮箱注册了新号,实则不需要)
接下来就是在网页端实现对ip的获取和存储。
请求
以下是简化的请求格式,仅供参考
请求ip
const ipAddresses = '';//接入获取ip的api
try {
const response = await fetch(ipAddress);
const data = await response.json();
return data.ip;
}
在直接存储之前,我们还有读取文件的过程,我们还需要读取已有的数据并检验此ip是否已经被存储了,我们不重复存储数据才能实现进站计数效果,我认为这个效果要比之前那个刷新一次就记一次数的插件要好。
请求读取
const response = await fetch('https://raw.githubusercontent.com/用户名/库名/<文件> ');
//原生数据地址
‘这里为啥不用cdn加速了?’
因为我发现cdn加速获取不到最新数据,提交后会覆盖原有数据,使数据不准确
‘那这个get不会很慢吗?’
而且不挂梯子很容易失败,这就没有办法了,没有找到免费的国内数据库
请求存储
const updateResponse = await fetch('https://api.github.com/repos/用户名/库名/<文件> ', {
method: 'PUT',//put请求常用于文件更改或替换
headers: {
'Authorization': `<你生成的token> `,//当然这里是有很大的泄露风险的,或者说几乎是赤裸的,所以不要用作重要的数据,并且这里最好先加密再解密以绕过扫描,或者分成两段字符串,我猜的,感兴趣可以试试
'Content-Type': 'application/json'
},
body: JSON.stringify({
message: '',//提交注释信息
content: //编码后的存储数据
sha: //文件sha值,确保一致
})
});
https://api.github.com/repos/用户名/库名/<文件>是github提供的api,更多详见官方文档
其他逻辑不再详述,自此我们假设脚本已能成功获取存储ip了。
实现流程
这有什么可说的,不就
把获取和存储ip的脚本放到网页上
就行了吗?
是这样的,都多余了。
不过有几个值得记下来的地方。
网页在解析到<script>
时就会自动开始编译和执行脚本,但是我们的js脚本请求很慢,尤其还有个get原生国外网址,会导致页面加载不出来,解决的办法就是把脚本放到页面渲染完毕之后再执行。
所幸刚好有这样便捷的方法
<script defer></script>
顺便,把脚本拿到网页md文件的外面
<script src="你的/脚本/路径/目标脚本.js" defer></script>
如果放在模板文件里,就能让所有页面搭载上这个脚本了。
一些问题
文件上传时遇到了 - Push cannot contain secrets
这是github的私密扫描,不允许上传token等敏感信息,点击它返回的链接选择我愿意泄密
就可以了,当然确保确实不会泄露重要信息
同一ip连续的get全都是404因而被github禁止访问
get加上token允许访问的次数会多一些
我遇到这个问题是因为调试代码,一直失败,没办法的,调试好了就没有了。
脚本加载得很慢,不挂梯子成功率很低
我在想。
怎么调试代码
浏览器的控制台可以查看日志
根据返回的状态码判断问题
生成的token到期
重新生成token并调整token使用期限
如果是预期意外的过期,有可能是把token上传到了公开库,寻求方法绕过
到此为止吧
追加
现在会有时候返回422,如果一直返回倒也不奇怪,但是有时候返回,有时候又正常,这我就不明白了,这跟浏览器读取我的请求有关系吧。
如果返回429,说明限制了访问频率限制。18号追加
此方悬停