公开的ThingSpeak Channel可以将频道的数据以xmljson格式输出,所以可以用其生成Shields.io Dynamic Badge。我丢了段读取我Telegram频道订阅数的MATLAB脚本到ThingSpeak,挂上TimeControl每隔20分钟跑一次,订阅数写进ThingSpeak Public Channel,就可以作一个动态展示Telegram频道订阅数的Shields.io Badge啦。

用正则表达式去读Telegram频道订阅数

代码是这样的:

ChannelID1=343156;
wAPIkey1='YourWriteAPIKey';

clear cmc tele
% 读网页源码
try
    tele=urlread('https://t.me/matlab_tips');
catch
    pause(300);
    tele=urlread('https://t.me/matlab_tips');
end
cmc=regexp(tele,'<div class="tgme_page_extra">(\d*) members</div>','tokens');

if length(cmc)==1
    count1(1,1)=str2num(cell2mat(cmc{1}));
else
% 这一行是因为如果订阅数超过1K,源码数字中间会有个空格。
    cmc=regexp(tele,'<div class="tgme_page_extra">(\d*) (\d*) members</div>','tokens');
    count1(1,1)=str2num([cell2mat(cmc{1}(1)),cell2mat(cmc{1}(2))]);
end

% 写去ThingSpeak频道
try
    r1=thingSpeakWrite(ChannelID1, count1, 'WriteKey', wAPIkey1);
catch
    pause(300);
    r1=thingSpeakWrite(ChannelID1, count1, 'WriteKey', wAPIkey1);
end

ThingSpeak Public Channel数据输出

ThingSpeak Public Channel支持输出xmljsonCSV三种格式的数据,我选择的是xml,因为在浏览器里打开时其结构和层级比较清晰。下图是一个全部field输出最近一次数据的示例,链接是https://thingspeak.com/channels/343156/feed.xml?results=1,也可以输出单个field数据,也可以输出最近的多次数据,语法参见这个文档img

需要注意的是Shields.io需要jsonxml同层级下不能出现同名的item,所以就输出最近一次的就好。

Shields.io Dynamic Badge url写法

Shields.io主页上写基于xml数据的url规则是https://img.shields.io/badge/dynamic/xml.svg?url=<URL>&label=<LABEL>&query=<[//data/subdata](http://xpather.com/ "XPath syntax")>&color=<COLOR>&prefix=<PREFIX>&suffix=<SUFFIX>,我们照着写就好: https://img.shields.io/badge/dynamic/xml.svg?color=yellow&label=t.me/matlab_tips&query=%2F%2Fchannel%2Ffeeds%2Ffeed%2Ffield2&url=https%3A%2F%2Fapi.thingspeak.com%2Fchannels%2F343156%2Ffeeds.xml%3Fresults%3D1&suffix=%20subscribers

生成的Badge如下: 因为我这主题css的问题,图片都单独居中显示,所以只好以截图的形式展示这一堆。所以这图不是动态更新的。动态更新的请到Github页来看。