昨天,今天,明天,每天的每天,你是否都多懂得一点点...

星期二, 十一月 27, 2018

[Youtube][峰享投稿 | 林少] 3万速度 | 免费VPN | 等你来拿 | 安卓 | 苹果

tags: 免费,高速, VPN


这里推荐一款又快又不要钱的VPN, 便宜有好货。 这是峰哥分享技术交流超级群 https://t.me/fengsharegroup 林少发来的投稿。 视频的录制和APP的测试由林少提供。 谢谢林少, 欢迎大家投稿!

APP 下载地址

去广告证书,这个其实不太建议安装, 毕竟不安全。


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-


星期一, 十一月 26, 2018

[Youtube][我看新西兰]一天内经历春夏秋冬 | 看奥克兰一日四季的天气是怎么折磨我的 (第一次暴露住处)

Tags: 新西兰,奥克兰,天气,一日四季

为什么新西兰人见面喜欢聊天气? 奥克兰的天气到底有多诡异? 这个视频跟大家聊一聊,同时也记录了我在一天内是如何经历四季的。第一次拍我住的地方哦。

https://youtu.be/VEzzHo4cEQw

-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

星期四, 十一月 22, 2018

413 Request Entity Too Large nginx

用Nginx-proxy 的网站,上传文件时碰到413错误的解决方法

只是要加一个任意名字的conf 文件到 /etc/nginx/conf.d/ 里面。 注意扩展名一定要是 .conf

加一行client_max_body_size 100m; 在这个文件里面就可以了

然后重启nginx proxy

以下是我在ubuntu 服务器中的操作命令

#I have the nginx-proxy docker container named as nginx-proxy as well, modify to your own name
sudo docker exec -it nginx-proxy bash
# 100m is a big size, you may want to reduce it
echo 'client_max_body_size 100m;'   > /etc/nginx/conf.d/my_proxy.conf
exit
sudo docker stop  nginx-proxy
sudo docker start nginx-proxy


星期一, 十一月 19, 2018

Wordpress ERR_TOO_MANY_REDIRECTS wp_admin

我承认这个问题困扰了我好久。而且,为什么我原来的网站没事到现在扔然是一个迷。

当我在架设一个新的wordpress 网站的时候,我发现我无法使用HTTPS来访问。 我架设的方法和我原来的网站是一样的,而原来的网站没有这个问题。

如果我使用HTTP访问,是没有问题的,只要网站的网址设置没有问题。这个网址可以在数据库里wp_options 这个表格里直接改。 也可以在后台的常规设置里改。



但是HTTP显然不是我要的,这里有两个问题。

我的wordpress 架设在nginx-proxy 之后, nginx-proxy 会自动把HTTP转成HTTPS, 而转到HTTPS后, 问题就来了, 因为主站是HTTPS,而有些CSS和JS确是通过HTTP的, 这样就有Mix content 的问题, 导至CSS显示不正确。 而且用HTTP登录从来都不是一个好主意。

所以我在后台把HTTP改成HTTPS, 然后,就碰到了一个更讨厌的问题。首先CSS问题依旧, 然后就是当进入后台登录页面的时候,页面无法显示

浏览器提示

ERR_TOO_MANY_REDIRECTS 

而在Fiddler 里可以看到, 服务器一直在返回页面重定向


而问题的解决方法很简单,但却很难找,你需要在wp-config.php加一行

 $_SERVER['HTTPS'] = 'on'; 




很简单的一个改变,但是不懂的人去哪里知道呢。。。。希望这篇博客对你有用。

参考:

星期一, 十一月 12, 2018

同时使用 Hyper-V Docker 和 Virtual Box Docker Toolbox

有时候我们因为种种原因我们需要使用 Virtual Box, 而不能使用 Hyper-V. 而Virtual Box 和 Hyper-V 由于一个是二级虚拟,一个是一级虚拟, 它们两个是不能同时使用的。 当然,这里我要提示大家一下, 不能同时使用并不是不能同时安装。 它们可以同时存在, 只是不能同时启用罢了。 

我本来是一直在使用 Hyper-V 的, 因为我装的Docker 需要它。 但是最近我想安装 Geny Montion这个安卓模拟器, 而因为这个模拟器是基于Virtual Box 的, 导至无法启动。 而也有小伙伴跟我反应在Windows 7 和 Windows 10 家庭版里都没有 Hyper -V, 无法使用 Docker. 所以我就研究了下如何在Virtual Box 里使用Docker. 然后我发现, 其实Hyper-V 和Virtual Box是可以轮着用的,不需要卸载其中一个,只是切换的时候需要重启电脑。

首先,我使用了以下命令来禁用Hyper V, 需要在管理员模式下运行

bcdedit /set hypervisorlaunchtype off

如果你之后想重新启用 Hyper V, 使用以下命令

bcdedit /set hypervisorlaunchtype auto

禁用 Hyper-V 后, 重启电脑, 这时候你发现 Hyper V Manager 还是可以用的, 只是里面的虚拟机打不开了, 原来的Docker自动启动的时候也会出错。 

这个时候,下载 Docker ToolBox 并安装。 

安装的时候,可选安装 Virtual Box, 如果你已经安装了, 可以把勾去掉。

安装好后, 在桌面上点击Docker Quickstart Terminal, 就会进入一个特殊的命令行。 第一次启动要花点时间, 等进入以后, 你会看到一个以$ 开头的BASH 命令提示符。



这个时候你就可以直接输入 Docker 命令了。 

但是和Hyper V下的Docker 有一点区别, 当你用 -p 映射端口的时候, 你映射的不是本地端口, 而是虚拟机的端口,比如说我开了一个网页服务器用 -p 8080:80 这个参数, 最后服务器正常工作,但我却不能使用 localhost:8080 去访问它, 我需要使用 192.168.99.100:8080 去访问它。 而且你会注意到, 这个Docker 和你Hyper V里面的Docker 是分开的, 你所有的原来是Docker 容器都需要重建, 相关的镜像文件也要重新下载,这是因为他们在不同的虚拟机里运行。

因为我可能会切换回Hyper V去使用Docker, 所以我并不想改我代码里面的 localhost:8080这个服务器地址到 192.168.99.100:8080, 那怎么样才可以让 localhost:8080也工作呢? 其实办法很简单, 在Linux我们有个常用的小工具叫socat, 可以用来作端口转发, 而在Windows底下, 其实也有一个自带的工具可以做到。

这个命令叫netsh

以管理员身份输入以下命令, 就会把 localhost:8080 的访问数据转发到 192.168.99.100:8080
这样就不需要改动代码了。

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=localhost connectport=8080 connectaddress=192.168.99.100

当然,当你用完的时候,你需要使用以下命令来删除端口转发

netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=localhost 


你也可以创建另一个Ubuntu的虚拟机,再使用 ssh 通道来做端口转发 (可以映射到 localhost), 这是我在不知道 netsh可以做端口转发时想到的方法。

当你用完 Virtual Box 想回到 Hyper V了, 在管理员模式下输入以下命令, 然后重启

bcdedit /set hypervisorlaunchtype auto

你就又回到Hyper V里面了。 你的Virtual Box 和 Docker Toolbox 都还在,只是启动不了了。 但是你随时可以禁用 Hyper V 重新启用它们。



星期六, 十一月 10, 2018

Telegram AI 智能聊天机器人 | 上知天文, 下知地理 | 数学,天气,笑话,游戏,翻译通通都会 | 抄个100多行代码就能用 | 小白也能搞定

Tags:  
Telegram, 机器人,
 聊天机器人,机器人编程,机器人代码, Telegram代码,Telegram Bot, Hello world, Telegram编程 , AI


通过100多行代码将Telegram 机器人接到国产的AI 大脑, 功能强大, 懂数学, 懂成语,懂天气, 会讲笑话,还能玩游戏。

机器人的代码请翻到后面
代码已经写好,只要小小的改动就可以使用。

-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-


[javascript]
function doPost(e) {
  var body = JSON.parse(e.postData.contents);
  if (!checkIsMyMessage(body)){
    return;
  }

  if (body.message && body.message.chat){
  }

  var payload = tulinBotPayload(body);
  var payloads;

  if (Array.isArray(payload)){
    payloads = payload;
  } else {
    payloads = [payload]
  }

  for (var i = 0; i < payloads.length; i++){
    payload = payloads[i];
    if (payload){
      var res = PostTelegram(payload);
    }
  }

}
function tulinBotPayload(body) {
  var payload;
  var chatId = body.message.chat.id;
  payload = {
    "method": "sendMessage",
    "chat_id": chatId,
    "text": "",
    "disable_web_page_preview": true,
    "reply_to_message_id": body.message.message_id,
  };

  var tulinReq = {
    "reqType": 0,
      "perception": {
          "inputText": {
              // tulinjiqirenbot 改成你自己机器人的名字
              "text": body.message.text.replace("@tulinjiqirenBot", "")
          }
         
      },
      "userInfo": {
        // 改成你自己的图灵机器人的apikey 和 userId
          "apiKey": "4e8395e7721046e38e9c610de725edd7",
          "userId": "339657"
      }
  };


  var data = {
    'contentType': 'application/json',
    "method": "post",
    "payload": JSON.stringify(tulinReq)
  };

  var response = UrlFetchApp.fetch("http://openapi.tuling123.com/openapi/api/v2", data);
  var res = JSON.parse(response);

  if (res.results && res.results[0].values && res.results[0].values.text) {
    payload.text = res.results[0].values.text;
  }
  return payload;
}
function isPrivate(body) {
  var share =  getShareObject(body);
  var chat = share.chat;
  if (chat.type === "private") {
    return true;
  }
  return false;
}
function PostTelegram(payload) {
  var data = {
    'contentType': 'application/json',
    "method": "post",
    "payload": JSON.stringify(payload)
  };

  // 改成你自己机器人的 API token
  var res = JSON.parse(response);
  return res;
}
function checkIsMyMessage(body){
  var text = body.message.text;

  if (isPrivate(body)){
    return true;
  }

  if (body.message.reply_to_message) {
    if (body.message.reply_to_message.from.id == 750371992) {
      return true;
    }
  }

  if (text) {
    var paras = text.split(" ");
    if (paras[0] && paras[0].indexOf("@") >= 0){
      // tulinjiqirenbot 改成你自己机器人的名字, 全部小写
      if  (paras[0].toLowerCase().indexOf("tulinjiqirenbot") >= 0){
        return true;
      }
      return false;
    }
  }
  return false;
}

function getShareObject(body) {
  var payload;
  var from;
  var chat;
  var messageId;
  var callback_query_id;

  // use editMessage method instead if it's a callback 
  if (body.callback_query) {
    chat = body.callback_query.message.chat;
    chat.id = chat.id + "";
    messageId = body.callback_query.message.message_id;
    from = body.callback_query.from;
    callback_query_id = body.callback_query.id;
    payload = {
      "method": "editMessageText",
      "chat_id": chat.id,
      "message_id": messageId,
      "text": "",
      "parse_mode": "markdown",
      "disable_web_page_preview": false,
    };
  } else {
    from = body.message.from;
    chat = body.message.chat;
    chat.id = chat.id + "";
    messageId = body.message.message_id;
    payload = {
      "method": "sendMessage",
      "chat_id": chat.id,
      "text": "",
      "parse_mode": "markdown",
      "disable_web_page_preview": true,
      "reply_to_message_id": messageId,
    };

  }

  var share = {};
  share.payload = payload;
  share.from = from;
  share.chat = chat;
  share.messageId = messageId;
  share.callback_query_id = callback_query_id;

  return share;
}

[/javascript]

星期二, 十一月 06, 2018

使用Git apply patch 重复加Controller和相关文件的操作

当我们在写代码的时候,有时候我们需要做一些重复的工作。 比如我现在正在做的。 我需要加一个新的功能, 而在加这个功能的时候, 我有以下文件要加:

Controllers/EmailManagersController.cs
Data/EmailManagerContext.cs
Data/EmailManagerRepository.cs
Interfaces/IEmailManagerRepository.cs
Models/Core/Workspace/EmailManagerEntity.cs

然后有以下文件要改

Helpers/Common/CommonHelper.cs
Startup.cs
appsettings.Development.json
appsettings.json


而我之前已经做过了这样类似的操作 (假设这个commit 叫C1),只不过名字不一样而已。 当然加完这些文件后,具体的功能是要再写的。 但是加这些文件其实就是在重复劳动。 

有没有一种快速的方法可以生成这些文件, 并改变文件名和里面相关的类名呢?

我之前介绍过一种用Total commander sync 的方法。 今天我介绍一个用 git patch 的方法。

  • 首先, 我们在当前的版本上新建一个分支 (B1),我直接用的是 git flow feature start 

  • 然后, 我们找到我们之前做的那个commit, 然后用那个commit 创建一个单文件patch 

  • 用文本编辑器打开这个patch 文件, 来个查找与替换, 替换到原来的名字。

  • 这时候不要直接git apply 这个patch, 因为当前版本已经改了很多, patch 不会成功。

  • 回到C1之前的那个版本, 从这个版本做一个分支 (B_old), 在这个分支上git apply 自然就能成功

  • git apply 完后, 把这个分支 (B_old) merge 到最新版的分支 (B1), 这时候肯定会有conflict, 因为我们在C1的时候做过一样的操作, 所以这次操作就会问你要保留C1的改变还是保留这次的改变, 而我们是要同时保留。

  • 这个时候我们用Merge工具手动Merge 几下就好了, 我这里用的是 KDiff3. 

  • Merge 完后, Commit 就可以了。

这种方法可以省很多时候, 也不容易漏掉东西。 因为时间关系,就没有图片演示了, 如果有兴趣的话,可以留言给我做个图文教程。

--
Feng

星期五, 十一月 02, 2018

Change your Spark Billing Address in NZ

I looked around My Spark website and couldn't find the settings for billing address. 

MySpark doesn't have this feature. You have to go to fill this form to update your billing address.

星期四, 十一月 01, 2018

2018年11月港澳台直播源更新

Tags: Kodi, 直播, 港澳台,电视


之前的港澳台直播源好多失效了, 这两天我又收集了100多个,亲测后, 保留了70多个好用的。 我记录了直播源的编码格式还有分辨率。 为了方便大家筛选高清源,我在表单里还加了过滤器, 方便只想看高清的小伙伴们。

我的网站提供了直播源文件的下载, 有txt 和 m3u8 两种格式。 

直播的表单和文件下载请到这里


想要删除低清频道的话, 请用列编辑神器自己做直播源列表文件
列编辑神器网址 https://columns.dengnz.com  

不懂做直播源列表文件或者不懂如何使用直播源列表文件的,  请看这个视频, 介绍直播源的文件制作和使用方法


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

[Youtube] Telegram Bot 连接Mongo DB 数据库, 超酷超好用的JSON数据库, 不需要学SQL啦[第七集]

Tags:  
Telegram, 机器人,
 聊天机器人,机器人编程,机器人代码, Telegram代码,Telegram BotTelegram编程  

本视频是Telegram Bot 机器人编程系列的第七集。 本集介绍如何在谷歌 Google App Scripts 中使用Mongo Db 数据库。 Mongo DB做为文档数据库, 数据的格式为JSON, 也就是和我们机器人处理的消息是同样的格式, 非常的方便, 而且大家也不用学SQL啦。


相关的代码请
翻到下面


免费数据库申请

下期预告:
 Telegram Bot 使用快捷按钮Inline Button, Reply Button和用户交互[第八集]  


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

[javascript]
function doGet(e){
  return HtmlService.createHtmlOutput("Hello World!! No, this link should be hidden!!!");
  
 //  return HtmlService.createHtmlOutputFromFile('Index');
}


function doPost(e){
  var body = JSON.parse(e.postData.contents);
  
  mongo.insert(logColl, body);

  var payload = preparePayload(body);
  var data = {    
    "method": "post",
    "contentType": 'application/json',
    "payload": JSON.stringify(payload),
  }
  
  mongo.insert("to-telegram", payload);
  
}

function getName(user) {
  var name = user.first_name;
  if (user.last_name) {
    name += " " + user.last_name;
  }

  return name;
}

function escapeMarkDown(toEscapeMsg) {
  var escapedMsg = toEscapeMsg
  .replace(/_/g, "\\_")
  .replace(/\*/g, "\\*")
  .replace(/\[/g, "\\[")
  .replace(/`/g, "\\`");
    return escapedMsg;

}


function getMentionName(user) {
  var username = user.username;
  var mentionName = "";

  var name = getName(user);
  if (!name) {
    name = "神秘人";
  }

  // if (!username) {
    mentionName = getMarkDownUserUrl(escapeMarkDown(name), user.id);
  // } else {
  //   mentionName = "[" + escapeMarkDown(name) + "](@" + escapeMarkDown(username) + ")";
  // }

  return mentionName;
}

function getMarkDownUserUrl(userName, userId) {
  return "[" + userName + "](tg://user?id=" + userId + ")";
}


function preparePayload(body){
  var payload;
  
  if (body.message.new_chat_member) {
     payload = {
        "method": "sendMessage",
        "chat_id": body.message.chat.id,
        "text": "你好, 欢迎加入本群",
        "parse_mode": "Markdown",
        "disable_web_page_preview": true,
      } 
      
      payload.text = "你好!" + getMentionName(body.message.new_chat_member) + ", 欢迎加入本群";
      return payload;
  }
  
  if (body.message.left_chat_member) {
     payload = {
        "method": "sendMessage",
        "chat_id": body.message.chat.id,
        "text": "你好, 欢迎加入本群",
        "parse_mode": "Markdown",
        "disable_web_page_preview": true,
      } 
      
      payload.text = getMentionName(body.message.left_chat_member) + "君, 一路走好!";
      return payload;
  }
  
   if (body.message.pinned_message) {
    payload = {
        "method": "sendMessage",
        "chat_id": body.message.chat.id,
        "text": "你好, 欢迎加入本群",
        "parse_mode": "Markdown",
        "disable_web_page_preview": true,
      } 
    var whoPinned = getName(body.message.from);
    var whoOwned = getName(body.message.pinned_message.from);

    payload.text = whoPinned + "置顶了消息:\n\n" + body.message.pinned_message.text
      + "\n\n"
      + "本BOT代表" + whoOwned + "感谢您"
      ;
    return payload;
  }


  body.message.text = body.message.text.toLowerCase();
  body.message.text = body.message.text.replace(/@temptestbot2/g, '');
  
  var paras = body.message.text.trim().split(" ");
  // remove empty strings
  paras = paras.filter(function(para){
    if (para){
      return true;
    }
  });
  
  
  
  if (body.message.text){
  
      payload = {
        "method": "sendMessage",
        "chat_id": body.message.chat.id,
        "text": "你好, 欢迎使用本机器人, 本机器人现在只认识颜色。",
        "parse_mode": "Markdown",
        "disable_web_page_preview": true,
      } 
      
      if(body.message.text.indexOf("/help") === 0){      
         payload.text = "你好, 欢迎使用本机器人, 本机器人现在只认识颜色。";
         return payload;
      }
      
      if(body.message.text.indexOf("/colors") === 0){   
         payload.text = "红\n黄\n蓝";        
         return payload;
      }
      
      if(body.message.text.indexOf("/list") === 0){ 
         if (paras[1]){
           switch (paras[1].toLowerCase()){
             case "people":  
               if (paras[2]){
                 if ("JS神技能".toLowerCase().indexOf(paras[2]) >= 0){
                   payload.text = "JS神技能 - https://www.youtube.com/channel/UC6tPP3jOTKgjqfDgqMsaG4g";
                 }
                 if ("悟空的日常".toLowerCase().indexOf(paras[2]) >= 0){
                   payload.text = "悟空的日常 - https://www.youtube.com/channel/UCii04BCvYIdQvshrdNDAcww";
                 }
                 if ("YuFeng Deng".toLowerCase().indexOf(paras[2]) >= 0){
                   payload.text = "YuFeng Deng - https://www.youtube.com/channel/UCG6xoef2xU86hnrCsS5m5Cw";
                 }
               } else {                 
                 payload.text = "JS神技能\n"
                   + "悟空的日常\n"
                   + "YuFeng Deng\n";        
                   return payload;
                }
               break;
             default:  
               payload.text = "红\n黄\n蓝";            
             break;
           }
                
           return payload;
         } else {         
           payload.text = "*JS神技能*\n"
             + "[悟空的日常](https://www.youtube.com/channel/UCii04BCvYIdQvshrdNDAcww)\n"
             + "[*YuFeng Deng*](https://www.youtube.com/channel/UCG6xoef2xU86hnrCsS5m5Cw)\n"
             + "_YuFeng Deng_\n"
             + "`01|" + "UCii04BCvYIdQvshrdNDAcww" + " | `\n"
             + "`02|" + "UCG6xoef2xU86hnrCsS5m5Cw" + " | `\n"
             + "```javascript\n"
             + 'payload = {\n'
             + '    "method": "sendMessage",\n'
             + '    "chat_id": body.message.chat.id,\n'
             + '    "text": body.message.text,\n'
             + '}'
             + "```"
             ;
                       
            var inlineKeyboardMarkup = {};
            inlineKeyboardMarkup.inline_keyboard = [];
            var keyboardRow = [];
            var keyboardButton1 = {
                text: "按钮1",
                url: "https://www.google.com"
            };
            
            var keyboardButton2 = {
                text: "按钮2",
                url: "https://www.google.com"
            };
            
            var keyboardRow2 = [];
            var keyboardButton3 = {
                text: "按钮3",
                url: "https://www.google.com"
            };
            
            var keyboardButton4 = {
                text: "按钮4",
                url: "https://www.google.com"
            };

            keyboardRow.push(keyboardButton1);
            keyboardRow.push(keyboardButton2);
            
            keyboardRow2.push(keyboardButton3);
            keyboardRow2.push(keyboardButton4);
            inlineKeyboardMarkup.inline_keyboard.push(keyboardRow);
            inlineKeyboardMarkup.inline_keyboard.push(keyboardRow2);
            payload.reply_markup = inlineKeyboardMarkup;

       
           return payload;
         }
      }
      

  
      payload = {
          "method": "sendMessage",
          "chat_id": body.message.chat.id,
          "text": body.message.text,
      } 
  }
  else if (body.message.sticker){
    payload = {
      "method": "sendSticker",
      "chat_id": body.message.chat.id,
      "sticker": body.message.sticker.file_id
    }
   }
  else if (body.message.photo){
    array = body.message.photo;
    text = array[1];
    payload = {
      "method": "sendPhoto",
      "chat_id": body.message.chat.id,
      "photo": text.file_id
    }
   }
    else {
    payload = {
      "method": "sendMessage",
      "chat_id": body.message.chat.id,
      "text": "Try other stuff"
    }
   }
  return payload
}

[javascript]

Test.gs
[javascript]
var testList = '{"update_id":427274836,"message":{"message_id":173,"from":{"id":539065210,"is_bot":false,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","language_code":"en-US"},"chat":{"id":539065210,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","type":"private"},"date":1538193751,"text":"/list","entities":[{"offset":0,"length":5,"type":"bot_command"}]}}';
var testList2 = '{"update_id":427275035,"message":{"message_id":211,"from":{"id":539065210,"is_bot":false,"first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","language_code":"en-US"},"chat":{"id":"539065210","first_name":"Yufeng Deng","last_name":"峰哥","username":"fennng","type":"private"},"date":1540807486,"text":"/list","entities":[{"offset":0,"length":5,"type":"bot_command"}]}}';
var isDebug = false;

function debug() {
  e = {};
  e.postData = {};
  e.postData.contents = testList2;
  doPost(e);
}

[javascript]

MLab.gs
[javascript]
var dbUrl = baseUrl + "databases/mongo/";
var collectionUrl = dbUrl + "collections/";

var logColl = "logs";

var mongo = {};

function debugMLab(){
  debug();
}

function testMLab(){

  var testObject = {"name": "峰哥"};
  mongo.insert(logColl, testObject);

}

function testMLab2() {
  var query = {"message.from.id": 539065210};
  var q = JSON.stringify(query);
  var a = mongo.get(logColl, "q=" + q);
  var b = a[0];
  Logger.log(a);
}


function testMLab3() {
  mongo.put(logColl, null, []);
}

mongo.insert = function(collection, data) {
  var db = apendAPI(collectionUrl + collection);
  var option = getInsertOption(data);
   Logger.log(data);
  var response = UrlFetchApp.fetch(db, option);
//  Logger.log(response);
   Logger.log(data);
}

mongo.update = function(collection, query, set) {
  var db = apendAPI(collectionUrl + collection);
  db += "&" + query + "&m=true&u=true";
  var option = getPutOption(set);
  UrlFetchApp.fetch(db, option);
}

// Warning, put will override the whole collectoin, put empty array data will clear the whole collection
mongo.put = function(collection, query, data) {
  var db = apendAPI(collectionUrl + collection);
  if (query){
    db += "&" + query;
  }
  var option = getPutOption(data);
  var url = encodeURI(db);
  UrlFetchApp.fetch(url, option);
}
mongo.get = function(collection, query) {
  var db = apendAPI(collectionUrl + collection);

  if (query){
    db += "&" + query;
  }

  var option = getGetOption();
  var response = UrlFetchApp.fetch(encodeURI(db), option);

  return JSON.parse(response);
}

function apendAPI(url){
  return url + "?apiKey=WULdZqaqxqikzrGePcLC5uWBeyvGZqBp";
}


function getInsertOption(data){
  var option = {
    "method": "post",
    'contentType': 'application/json',
//    "muteHttpExceptions": true, 
    "payload": JSON.stringify(data)
  }
  return option;
}
function getPutOption(data){
  var option = {
    "method": "put",
    'contentType': 'application/json',
    "payload": JSON.stringify(data)
  }
  return option;
}
function getGetOption(){
  var option = {
    "method": "get",
  }
  return option;
}






[javascript]

其它博客地址

此博客的同步博客地址: http://fengnz.wordpress.com
这里进入我的MSN SPACE.