不翻墙查看googlesheet内容
2022年6月24日update:
现在是blog服务器在境内,在blog主页侧边栏显示googlesheet同步的图片,实现方法如下:
1、googlesheet发布图片
2、googlesheet用脚本定时刷新
3、发布的图片地址找个短链接转一下
4、在境外服务器上设置cron定时作业,执行一个sh文件,文件内容是抓取这个短链接
例如新建一个1.sh,里面写:
wget https://tinyurl.com/yxgzd3vk -O blog1.jyzzj.online/wp-content/uploads/googlesheetchart.png
wget https://tinyurl.com/yxgzd3vk -O blog1.jyzzj.online/wp-content/uploads/googlesheetchartbk.png
抓两次,第二个文件名后面+了个bk,因为有时候wget会抓不到,形成一个0字节的文件。
5、在境内服务器上设置cron定时作业,执行一个sh文件,文件内容是抓取境外的服务器上抓到的文件。这一步实际就是翻墙,因为google被大陆墙了,但是自己的境外服务器没有被墙。
例如新建一个1.sh,里面写:
wget http://blog1.jyzzj.online/wp-content/uploads/googlesheetchart.png -O /www/wwwroot/retire50blog.wang/wp-content/uploads/googlesheetchart.png
wget http://blog1.jyzzj.online/wp-content/uploads/googlesheetchartbk.png -O /www/wwwroot/retire50blog.wang/wp-content/uploads/googlesheetchartbk.png
6、wordpress装一个xyz php的插件,插件可以编写php代码并保存,代码可以插入到小工具里。写一段代码如下:
<?php
$StrA='<img src=’;
$StrAX='<a href=’;
$StrC= substr(md5(time()), 0, 4);
$StrD=’ /></a>’;
$StrDX=’ >’;
$StrB1=’https://retire50blog.wang/wp-content/uploads/googlesheetchart.png?’;
$StrB1BK=’https://retire50blog.wang/wp-content/uploads/googlesheetchartbk.png?’;
$StrB1BK3=’https://blog1.jyzzj.online/wp-content/uploads/googlesheetchart.png?’;
$StrP1 = $StrA.$StrB1.$StrC. $StrD;
$StrP1X=$StrAX.$StrB1.$StrC. $StrDX;
$StrP1XXX= $StrP1X. $StrP1;
$StrP1BK = $StrA.$StrB1BK.$StrC. $StrD;
$StrP1BKX=$StrAX.$StrB1BK.$StrC. $StrDX;
$StrP1BKXXX = $StrP1BKX.$StrP1BK;
$StrP1BK3 = $StrA.$StrB1BK3.$StrC. $StrD;
$StrP1BK3X = $StrAX.$StrB1BK3.$StrC. $StrDX;
$StrP1BK3XXX=$StrP1BK3X.$StrP1BK3;
$url=’./wp-content/uploads/googlesheetchart.png’;
$urlBK=’./wp-content/uploads/googlesheetchartbk.png’;
if (file_exists($url))
{
if(filesize($url)==0){
if (file_exists($urlBK)){
if(filesize($urlBK)==0){
echo $StrP1BK3XXX;
}
else{
echo $StrP1BKXXX;
}
}
else{
echo $StrP1BK3XXX;
}
}
else {
echo $StrP1XXX;
}
}
else {
if (file_exists($urlBK)){
if(filesize($urlBK)==0){
echo $StrP1BK3XXX;
}
else{
echo $StrP1BKXXX;
}
}
else{
echo $StrP1BK3XXX;
}
}
这段比较长,程序会先判断本地googlesheetchart文件是不是存在,不存在就接着看本地googlesheetchartbk文件是不是存在,还不存在就去境外服务器上找googlesheetchart文件,这样有三次机会,最大限度避免了wget抓取失败的问题。文件抓到以后,再给地址后面加上了时间戳,避免浏览器缓存对同一地址不刷新的问题。
这套方法看起来很土,但是实践下来稳定可靠,很好用。提供类似服务的一些网站,比如tableau、datawrapper,要达到同样的效果,花费可都不小。
2019年11月21日update:
这次是把blog搬到了国内,还编成了微信小程序,国外服务器也还在用。发现编成小程序之后,文章里的js工作不了,但是php代码段可以。
因此就新装了个支持php代码段插入的插件Insert PHP Code Snippet,用php程序来判断文件是否存在,是否下载完毕(长度是否为0),如果是的话就输出,不是的话换1号备用图,再对备用图判断一遍,行的话输出,不行的话用2号。这样有三个图备用,可靠性应该可以了。其中前两个图在本地,速度快一点,第三个在没有被屏蔽的境外服务器。我这个代码很垃圾,就是上面这个意思。哎..能用就行,存一下。
$StrA='<img src=”; $StrC= substr(md5(time()), 0, 4); $StrD=” />’;
$StrB1=’https://retire50blog.wang/wp-content/uploads/googlesheetchart.png?’;
$StrB1BK=’https://retire50blog.wang/wp-content/uploads/googlesheetchartbk.png?’;
$StrB1BK3=’https://blog1.jyzzj.online/wp-content/uploads/googlesheetchart.png?’;
$StrP1 = $StrA.$StrB1.$StrC. $StrD;
$StrP1BK = $StrA.$StrB1BK.$StrC. $StrD;
$StrP1BK3 = $StrA.$StrB1BK3.$StrC. $StrD;
$url=’./wp-content/uploads/googlesheetchart.png’;
$urlBK=’./wp-content/uploads/googlesheetchartbk.png’;
if (file_exists($url))
{
if(filesize($url)==0){
if (file_exists($urlBK)){
if(filesize($urlBK)==0){
echo $StrP1BK3;
}
else{
echo $StrP1BK;
}
}
else{
echo $StrP1BK3;
}
}
else {
echo $StrP1;
}
}
else {
if (file_exists($urlBK)){
if(filesize($urlBK)==0){
echo $StrP1BK3;
}
else{
echo $StrP1BK;
}
}
else{
echo $StrP1BK3;
}
}
2019年1月29日update:
wget多个文件可以用-i函数逐行读取txt里的url,但是没法用-O参数逐一重命名
写一个1.sh,第一行写#!/bin/sh,后面内容是逐行的wget -O 文件名 路径,
然后在cron计划里设定每10分钟执行一次1.sh
2019年1月26日 update:
发现图片用wget下载有时候会变成0字节
想了个解决办法,Cron任务下载两个文件,比如一个a.npg,a-bk.png,如果a不能访问就访问b,两个都不行那也就算了。
如果一个变成0字节的概率是百分之3,两个都0字节概率就是万分之9,可以了。
<script>
var myDate = new Date();
var timestamp = (new Date()).valueOf();
var urljyzzj = “https://retire50blog.wang/wp-content/uploads/googlesheetchart.png?t=”+timestamp;
var urljyzzja = “https://retire50blog.wang/wp-content/uploads/googlesheetchartbk.png?t=”+timestamp;
function nofind(){
var img=event.srcElement;
img.src=urljyzzja;
img.onerror=null;
}
document.write(“<a href=”+urljyzzj+”>”);
document.write(“<img src=”+urljyzzja+” onerror=\”nofind();\””+”/>”);
document.write(“</a>”);
</script>
还发现手机访问页面时候图片比较小,网上找了个代码,自动区分桌面和移动版,分别跳转
<html>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”initial-scale=1, maximum-scale=1, user-scalable=no” />
<script type=”text/javascript”>
function browserRedirect() {
var sUserAgent = navigator.userAgent.toLowerCase();
var bIsIpad = sUserAgent.match(/ipad/i) == “ipad”;
var bIsIphoneOs = sUserAgent.match(/iphone os/i) == “iphone os”;
var bIsMidp = sUserAgent.match(/midp/i) == “midp”;
var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == “rv:1.2.3.4”;
var bIsUc = sUserAgent.match(/ucweb/i) == “ucweb”;
var bIsAndroid = sUserAgent.match(/android/i) == “android”;
var bIsCE = sUserAgent.match(/windows ce/i) == “windows ce”;
var bIsWM = sUserAgent.match(/windows mobile/i) == “windows mobile”;
if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
//跳转移动端页面
window.location.href=”https://retire50blog.wang/2019m.html”;
} else {
//跳转pc端页面
window.location.href=”https://retire50blog.wang/2019p.html”;
}
}
browserRedirect();
</script>
</head>
<body>
</body>
</html>
2019年1月25日 update
原文的方法傻透了,其实只要vps后台用Cron 定时每半小时下载google发布的图片,以固定的名字放到指定目录下就行了
wget https://t.cn/E5glOJf -O retire50blog.wang/wp-content/uploads/googlesheet.png
为什么要用短链接是因为原来的地址里有个“?”,还有个“=”,下载出错。
下载来以后再加上?t=timestamp防止缓存。
我的情况是这样的,自己的数据都在googlesheet上,这个blog在国外空间。
假设我要在blog上发布一个页面,动态显示我2019年的长期头寸及其浮动盈亏,我只要文章里引用googlesheet发布的链接就可以了。
不过实际上这样是不行的。国内用户访问我的blog是可以得,它没有被墙,但是google的服务被墙了,文章里涉及的google链接国内用户都显示不了,不单显示不了,还会卡住,正常页面都打不开。
昨天突发奇想,曲线实现了不翻墙查看googlesheet内容。
原理如下:
1googlesheets指定内容进行发布
2用zapier.com生成或直接获取内容的图片,上传到wordpress
3设置zapier定时自动执行第2步
介绍一下zapier,它是一个挺好玩的网站,连接大量的网络服务并提供自动处理和执行的服务,类似ifttt.com。它说是永久免费,免费用户一个月能自动执行100条,但是只能执行两步。
上面的步骤里有一些问题:
1抓取频率,我在zapier上设定每天5点12点17点执行三次。就两个步骤,定时运行和上传图片。
2上传文件,如果存在重名就会被自动重命名为 xxx-1 xxx-2这样的格式,导致图片的链接没法同步更新。
3为了解决链接和文件名匹配的问题,我将图片文件命名为googlesheetsnapshotYYYY-M-D-Hour.png的格式,然后在页面上用js代码判断当前时间,选择调用的图片。每天0-5点调用前一天下午5点的图片,5-12点调用当天5点的,12-17点调用当天12点的,17-24点调用当天17点的。
<script>
var myDate = new Date();
var timestamp = (new Date()).valueOf();
var year = myDate.getFullYear();
var month = myDate.getMonth()+1;
var day = myDate.getDate();
var newDay = year + “-” + month + “-” + day;
newDay = year + “-” + month + “-” + day;
var hour = myDate.getHours();
var dayyes =day-1;
var newDayyes= year + “-” + month + “-” + dayyes;
var urljyzzj = “https://retire50blog.wang/wp-content/uploads/googlesheetsnapshot”;
var s;
if (hour<5)
{
s= urljyzzj+newDayyes+”pm5.png?t=”+timestamp;
}
if (hour<12 && hour>=5)
{
s= urljyzzj+newDay+”am5.png?t=”+timestamp;
}
if (hour<17 && hour>=12)
{
s= urljyzzj+newDay+”.png?t=”+timestamp;
}
if (hour<24 && hour>=17)
{
s= urljyzzj+newDay+”pm5.png?t=”+timestamp;
}
document.write(“<a href=”+s+”>”);
document.write(“<img src=”+s+”>”);
document.write(“</a>”);
</script>
4图片名称和链接匹配了,但是旧文件会越来越多,需要删除
5我解决的方法是在vps后台新建Cron 作业,每天5点执行一次,代码是
rm -f retire50blog.wang/wp-content/uploads/googlesheetsnapshot*.png
用date +”%Y-%m-%d”和date +”%H-%M-%S”,可以查询linux vps 的时间,发现比北京时间早13个小时,所以我要它北京时间5点执行,实际是服务器上16点执行,为了避免和5点抓取并上传的时间冲突,这个删除任务再提前3分钟,放到每天vps上15:57执行。
6由于浏览器有缓存,可能出现图片变了,但是打开还是缓存图片的问题,在图片地址后面加上?t=timestamp
var timestamp = (new Date()).valueOf();
终于,我有了一张每天三次动态更新的数据图表。见下面链接:
https://retire50blog.wang/2019.html