github如何发起一个push request注意事项

软件工程atool 发表了文章 • 0 个评论 • 717 次浏览 • 2016-04-22 13:11 • 来自相关话题

github发起一个push request步骤

1、在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。

如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream git@github.com:hustcc/dig_hash.git2、将本地的修改提交 commit

3、在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。

3.1 更新源项目的代码到最新 
git remote update upstream3.2 rebase最新代码

注意在rebase之前,将自己项目切换到对应的branch,如:
git checkout develop然后:
git rebase upstream/{branch name}需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,如:
git checkout develop4、 Push 代码到 Github
git push origin {branch name}5、push request
到github网页上发起push request即可。 查看全部
github发起一个push request步骤

1、在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可。

如: 其中# upstream 表示上游代码库名, 可以任意。
git remote add upstream git@github.com:hustcc/dig_hash.git
2、将本地的修改提交 commit

3、在每次 Pull Request 前做如下操作,即可实现和上游版本库的同步。

3.1 更新源项目的代码到最新 
git remote update upstream
3.2 rebase最新代码

注意在rebase之前,将自己项目切换到对应的branch,如:
git checkout develop
然后:
git rebase upstream/{branch name}
需要注意的是在操作3.2之前,一定要将checkout到{branch name}所指定的branch,如:
git checkout develop
4、 Push 代码到 Github
git push origin {branch name}
5、push request
到github网页上发起push request即可。

华中科技大学第三届研究生红色楷模十佳特色党日活动——自动化学院

其他类型atool 发表了文章 • 0 个评论 • 262 次浏览 • 2016-04-22 13:06 • 来自相关话题

       华中科技大学第三届研究生红色楷模十佳特色党日活动——自动化学院

习近平总书记在参观《复兴之路》展览时指出:实现中华民族伟大复兴,就是中华民族近代以来最伟大的梦想!这一时代解读,既饱含着对近代以来中国历史的深刻洞悉,又彰显了全国各族人民的共同愿望和宏伟愿景,为党带领人民开创未来指明了前进方向。为了让广大研究生党员更好更透彻地领悟习总书记指出的“中国梦”的于党、于自身的含义,自动化学院特举办以“夏日繁星”为主题的特色党日活动。

浩瀚的星空总是给人无穷的遐想,也总是启迪和激励着人们去研究和探索未知的事物。而夏日里明亮的星辰又总是显得如此耀眼和浪漫,那一眨一眨的星光似乎在告诉着人们:这里才是未来的方向。“中国梦·学术情”这两个大主题,正如夏日里的星空一般,是如此的浩瀚与广阔,却也如此的闪亮和执着,正基于此,我们特将此次特色党日活动命名为“夏日繁星”。

本次特色党日活动是华中科技大学自动化学院成立后举办的第一次特党活动,活动由院党委、支部联合会、研究生会精心策划和筹办,活动主要分为“学术之星”评选、“学术之星”风采展示、自研智语优秀学子交流会等三个部分组成。活动内容严谨朴实却也不失趣味,让所有的研究生同学都能在活动过程中领悟“中国梦”于自身的意义,激励自己更加勤奋努力的学习,为实现中华民族伟大复兴的“中国梦”做出自己的贡献。

自动化学院成立不久,很多同学都不熟悉,很多制度还没来得及完全建立起来,在这样一个情况下,能够把大家召集起来参与这样一个活动是很不容易的。但是让我感到惊讶的是,虽然同学们各有各的忙,但是有一种莫名的凝聚力把我们凝聚在了一起。我深刻的感觉到我们这个支部的凝聚力和团队协作能力,要知道,无论是在学校还是将来出来工作的时候,团队协作的能力是十分重要的的,自己一个人完成工作除了会使自己更累之外,工作的结果也未必令人满意。只有同学之间或同事之间互相合作,为工作一起能力,一起出点子,才能将工作轻松且出色的完成。 查看全部
       华中科技大学第三届研究生红色楷模十佳特色党日活动——自动化学院

习近平总书记在参观《复兴之路》展览时指出:实现中华民族伟大复兴,就是中华民族近代以来最伟大的梦想!这一时代解读,既饱含着对近代以来中国历史的深刻洞悉,又彰显了全国各族人民的共同愿望和宏伟愿景,为党带领人民开创未来指明了前进方向。为了让广大研究生党员更好更透彻地领悟习总书记指出的“中国梦”的于党、于自身的含义,自动化学院特举办以“夏日繁星”为主题的特色党日活动。

浩瀚的星空总是给人无穷的遐想,也总是启迪和激励着人们去研究和探索未知的事物。而夏日里明亮的星辰又总是显得如此耀眼和浪漫,那一眨一眨的星光似乎在告诉着人们:这里才是未来的方向。“中国梦·学术情”这两个大主题,正如夏日里的星空一般,是如此的浩瀚与广阔,却也如此的闪亮和执着,正基于此,我们特将此次特色党日活动命名为“夏日繁星”。

本次特色党日活动是华中科技大学自动化学院成立后举办的第一次特党活动,活动由院党委、支部联合会、研究生会精心策划和筹办,活动主要分为“学术之星”评选、“学术之星”风采展示、自研智语优秀学子交流会等三个部分组成。活动内容严谨朴实却也不失趣味,让所有的研究生同学都能在活动过程中领悟“中国梦”于自身的意义,激励自己更加勤奋努力的学习,为实现中华民族伟大复兴的“中国梦”做出自己的贡献。

自动化学院成立不久,很多同学都不熟悉,很多制度还没来得及完全建立起来,在这样一个情况下,能够把大家召集起来参与这样一个活动是很不容易的。但是让我感到惊讶的是,虽然同学们各有各的忙,但是有一种莫名的凝聚力把我们凝聚在了一起。我深刻的感觉到我们这个支部的凝聚力和团队协作能力,要知道,无论是在学校还是将来出来工作的时候,团队协作的能力是十分重要的的,自己一个人完成工作除了会使自己更累之外,工作的结果也未必令人满意。只有同学之间或同事之间互相合作,为工作一起能力,一起出点子,才能将工作轻松且出色的完成。

xcode编译cocos2d-x 3.0及以上版本支持arm64位

游戏开发atool 发表了文章 • 0 个评论 • 1943 次浏览 • 2016-04-22 13:05 • 来自相关话题

在使用cocos2d-x 3.0rc lua版本完成游戏过程中,真机存在一个问题:

1. 使用iphone4s真机调试,可以正常运行通过;

2. 使用iphone4s以上版本真机调试的时候,不能够正常编译,出现的的错误是cc命名空间下的很多方法找不到,具体都是cocos2d-x的代码找不到。

虽然直接使用iphone4s连接手机,achieve出来的ipa包也可以在所有ios设备上运行,但是提交appstore的时候,就会出现错误:ERROR ITMS-90086:"missing 64-bit support. beginning on february 1, 2015, new iOS apps submitted to the app store must be include 64-bit support and be built with the ios8 SDK......"。




大致意思是app store从2015年2月1号开始,不再接受不支持64位的app上线。

解决办法如下:

1.将所有的cocos2d-x xcode项目的project和target中的building-setting设置项中的architectures、supported platforms、validarchitectures,另外非常重要的一个配置是build active architecture only全部设置为No。下图所示:




需要修改p2,cocos2d_lua_bindings.xcodeproj, cocos2d_libs.xcodeproj三个项目中的building-setting。如下图所示:




修改之后,就会发现之前出现的“cc命名空间下的很多方法找不到”的错误都消失了,出现的都是关于图片读取的问题,这个问题解决见步骤2;

2.因为cocos2d-x3.0rc版本没有将图片相关的64位库加入,引入相关的图片读取解析的64位库;如下图所示:




具体就是上述中_arm64.a结尾的库。

上述问题解决了,但是又出现lua里面的方法找不到的错误,解决办法见步骤3;

3.由于cocos2d-x3.0rc使用的是luajit,但是只引入了libluagit.a库,这个库是32位的,所以无法编译64位,于是找到一个liblua.a的库,引入lua.a到项目即可。如下图:




三步完成,问题全部解决,打包,重签,测试,没有任何问题。

Enjoy~
  查看全部
在使用cocos2d-x 3.0rc lua版本完成游戏过程中,真机存在一个问题:

1. 使用iphone4s真机调试,可以正常运行通过;

2. 使用iphone4s以上版本真机调试的时候,不能够正常编译,出现的的错误是cc命名空间下的很多方法找不到,具体都是cocos2d-x的代码找不到。

虽然直接使用iphone4s连接手机,achieve出来的ipa包也可以在所有ios设备上运行,但是提交appstore的时候,就会出现错误:ERROR ITMS-90086:"missing 64-bit support. beginning on february 1, 2015, new iOS apps submitted to the app store must be include 64-bit support and be built with the ios8 SDK......"。
111.png

大致意思是app store从2015年2月1号开始,不再接受不支持64位的app上线。

解决办法如下:

1.将所有的cocos2d-x xcode项目的project和target中的building-setting设置项中的architectures、supported platforms、validarchitectures,另外非常重要的一个配置是build active architecture only全部设置为No。下图所示:
222.png

需要修改p2,cocos2d_lua_bindings.xcodeproj, cocos2d_libs.xcodeproj三个项目中的building-setting。如下图所示:
333.png

修改之后,就会发现之前出现的“cc命名空间下的很多方法找不到”的错误都消失了,出现的都是关于图片读取的问题,这个问题解决见步骤2;

2.因为cocos2d-x3.0rc版本没有将图片相关的64位库加入,引入相关的图片读取解析的64位库;如下图所示:
444.png

具体就是上述中_arm64.a结尾的库。

上述问题解决了,但是又出现lua里面的方法找不到的错误,解决办法见步骤3;

3.由于cocos2d-x3.0rc使用的是luajit,但是只引入了libluagit.a库,这个库是32位的,所以无法编译64位,于是找到一个liblua.a的库,引入lua.a到项目即可。如下图:
555.png

三步完成,问题全部解决,打包,重签,测试,没有任何问题。

Enjoy~
 

Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成"

移动开发atool 发表了文章 • 0 个评论 • 1955 次浏览 • 2016-04-22 12:59 • 来自相关话题

在iOS上开发视频操作的时候,出现错误:

Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成"UserInfo=0x1780fb480 {NSUnderlyingError=0x1706495d0 "The operation couldn’t be completed. (OSStatus error -12673.)", NSLocalizedFailureReason=发生未知错误(-12673), AVErrorRecordingSuccessfullyFinishedKey=false, NSLocalizedDescription=这项操作无法完成},file:///var/mobile/Applications/D0CA65C7-F218-46F1-80BC-B0FA886EDF3B/video.mov

具体是使用AVFoundation录制使用,然后保存再文件中。

产生错误:Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成"的原因都是因为存储的文件路径NSURL有问题。即使你打印出来没有什么问题,但是就是报错,确实蛋疼。

解决办法,重写输出文件的路径NSURL。给一个例子:
// 初始化保存的路径
NSString *documentsDirPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSURL *documentsDirUrl = [NSURL fileURLWithPath:documentsDirPath isDirectory:YES];
self.saveMovieFile = [NSURL URLWithString:@"video.mp4" relativeToURL:documentsDirUrl];当然,在使用这个路径之前,记得先检查这个文件是否存在,如果存在则先删除文件,否则会报另外一个错误。
Enjoy~
  查看全部
在iOS上开发视频操作的时候,出现错误:

Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成"UserInfo=0x1780fb480 {NSUnderlyingError=0x1706495d0 "The operation couldn’t be completed. (OSStatus error -12673.)", NSLocalizedFailureReason=发生未知错误(-12673), AVErrorRecordingSuccessfullyFinishedKey=false, NSLocalizedDescription=这项操作无法完成},file:///var/mobile/Applications/D0CA65C7-F218-46F1-80BC-B0FA886EDF3B/video.mov

具体是使用AVFoundation录制使用,然后保存再文件中。

产生错误:Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成"的原因都是因为存储的文件路径NSURL有问题。即使你打印出来没有什么问题,但是就是报错,确实蛋疼。

解决办法,重写输出文件的路径NSURL。给一个例子:
// 初始化保存的路径
NSString *documentsDirPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSURL *documentsDirUrl = [NSURL fileURLWithPath:documentsDirPath isDirectory:YES];
self.saveMovieFile = [NSURL URLWithString:@"video.mp4" relativeToURL:documentsDirUrl];
当然,在使用这个路径之前,记得先检查这个文件是否存在,如果存在则先删除文件,否则会报另外一个错误。
Enjoy~
 

小黄鸡SimSimi API以及小i机器人的说明——如何免费使用?

移动开发atool 发表了文章 • 0 个评论 • 2642 次浏览 • 2016-04-22 12:57 • 来自相关话题

一、什么是Simsimi?

simsimi公司是提供智能服务,其中一个服务是simsimi聊天机器人服务,每天有超过百万的用户聊天,国内最大的搜索引擎——百度的产品siri使用的就是simsimi提供的api。

你可以在网址http://www.simsimi.com/talk.htm# 进行体验

SimSimi inc. is specialized in collective intelligence service. All kinds of services we provide generates unique entertainment and values through systemized collective intelligence.

One of our services, a chatting robot SimSimi exceeds the limitation of technology of natural-language processing system by collective intelligence and it has a chat with over millions user per day. Our Premium knowledge providing service “Jisikman” creates millions of valuable knowledges a day.

We invite you to our realm of service which is available through our cloud of collective intelligence, Crowd Cloud that SimSimi inc. creates.

二、Simsimi小黄鸡API

在去年的这个时候,小黄鸡的非官方api一度被大家疯狂的在微信公众号上使用,一时间不知道成就了多少微信营销号,同时,华科某位大四学生利用这个api,结合人人网开发平台,制作了一个小黄鸡的人人号,@小黄鸡之后,就可以利用api自动进行回复,是的这个人人号瞬间粉丝陡增。

然而大家使用的都是非官方的API,所谓非官方,就是不是simsimi公司提供的合法使用途径,API大致的原理是利用编程语言,模拟浏览器发送post请求到http://www.simsimi.com/talk.htm# 链接,解析响应,然后作成相关的小黄鸡API。这个方法后来被我在本博客中在博文中发布,导致使用人数激增,simsimi公司似乎察觉了什么,立马对这种模拟请求的方式做出了屏蔽,一旦某ip请求数量和频率超过限制,则终端对它的请求。正式官方对非法API的封锁,也使用国内的开发这关注到之前并不出名的小i机器人,同样使用语言模拟请求web聊天界面,时间没有过很久,这个页面就加入了图片验证码防止程序模拟。

至此,两个聊天机器人都走上了收费的道路...准确的说,应该是被这帮子开发者赶上了收费的道路,因为他们给它带来了知名度。

三、SimsimiAPI使用




目前,小黄鸡API已经公然收费(http://developer.simsimi.com/api)
不过,和之前一样,会给注册用户提供30天的试用API。
API请求链接为:
Trial-key    http://sandbox.api.simsimi.com/request.p
Paid-key    http://api.simsimi.com/request.p

API请求参数见官网。
 
API返回格式为:

result:100-ok. 400-Bad Request. 401-Unauthorized. 404-Not found. 500-Server Error.    返回的code

id:Response id. (you can get only if returning result is 100)回复的id,由系统生成,当请求成功返回时才有这个字段。 

response:Response message(you can get only if returning result is 100)返回的回复内容。

msg:Result  msg(Description of result code) 返回的code对应的含义

四、Simsimi使用举例

请求举例:

Trial-key    http://sandbox.api.simsimi.com ... %3Dhi   
Paid-key    http://api.simsimi.com/request ... %3Dhi

响应举例:

{ "result": 100, "response": "Who are you?!", "id": 13185569, "msg": "OK." }

五、如何免费的使用Simsimi API

我想,大家都懂了,写这篇文章的原因就是很多人搜索小黄鸡 api到我的博客,我想大家都是要找免费的小黄鸡API。这里提供给大家一个思路:
 
合作伙伴中,有人人网,为什么?本博文前面提高某大四学生做了一个人人号,@小黄鸡之后,会自动进行回复,他使用的就是simsimi的官方正版付费API,既然人人网提供开发平台,可以对帐号进行回复,获得回复等等操作,为什么不能使用程序,登录帐号,然后@小黄鸡,然后获得它的回复,再返回给你自己的用户呢?答案当然是可以的!!!

下面贴出一段可供参考的Java代码,之所以为仅供参考,就是说只能参考思路,代码运行是运行不起来的!!!如果能够帮助到你,希望回复点评一下,并点点广告,你懂的...
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
/**
* 利用httpclient操作人人网 比如登陆,发状态,模拟你访问任何人主页等等
* @author: http://50vip.com
*
*/
public class RenRen {
private String userName = "";
private String password = "";

private static String redirectURL = "http://www.renren.com/home";
private static String renRenLoginURL = "http://www.renren.com/PLogin.do";
private static String talkUrl = "http://photo.renren.com/photo/ ... 3B%3B
private HttpResponse response;
private DefaultHttpClient httpclient = null;
private String requestToken = null;
private String _rtk = null;

public RenRen(String userName, String password) {
this.userName = userName;
this.password = password;
}

public static void main(String[] args) {
RenRen rr = null;
rr = new RenRen("xxxxx@hotmail.com", "yyyyy");
rr.login();
System.out.println(rr.talk("820"));
}
/**
* 登陆
* @author: http://50vip.com
* @return
*/
public boolean login() {
if (httpclient != null) {
return true;
}
httpclient = null;
httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("origURL", redirectURL));
nvps.add(new BasicNameValuePair("domain", "renren.com"));
nvps.add(new BasicNameValuePair("autoLogin", "true"));
nvps.add(new BasicNameValuePair("formName", ""));
nvps.add(new BasicNameValuePair("method", ""));
nvps.add(new BasicNameValuePair("submit", "登录"));
nvps.add(new BasicNameValuePair("email", userName));
nvps.add(new BasicNameValuePair("password", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
//System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();
}

String redirectLocation = getRedirectLocation();
if (redirectLocation != null) {
// 跳到首页,登录完成
String indexHtml=getText(redirectLocation);

//获取requestToken get_check:'-2062261917'
Pattern pattern1 = Pattern.compile("get_check:'(.*)',get_check_x");
Matcher m1 = pattern1.matcher(indexHtml);
if (m1.find()) {
requestToken=m1.group(1);
} else {
System.out.println("获取requestToken失败!");
}

//"获取_rtk失败!"get_check_x:'50d55fbd'
Pattern pattern2 = Pattern.compile("get_check_x:'(.*)',env:");
Matcher m2 = pattern2.matcher(indexHtml);
if (m2.find()) {
_rtk=m2.group(1);
} else {
System.out.println("获取_rtk失败!");
}
}
return true;
}

/**
* 和人人的小黄鸡交谈
* @author: http://50vip.com
* @param msg
* @return
*/
public String talk(String msg) {
String repMsg="";//小黄的回复

HttpPost httpost = new HttpPost(talkUrl);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("_rtk", _rtk));
nvps.add(new BasicNameValuePair("requestToken", requestToken));
nvps.add(new BasicNameValuePair("message", msg));

try {
ResponseHandler<String> responseHandler = new BasicResponseHandler();
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
repMsg=httpclient.execute(httpost, responseHandler);
} catch (Exception e) {
e.printStackTrace();
} finally {
httpost.abort();
}
return repMsg;
}

/**
* 此处人人网会302跳转
* @author: http://50vip.com
* @return
*/
private String getRedirectLocation() {
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
}

/**
* 读取首页内容
* @author: http://50vip.com
* @param redirectLocation
* @return
*/
private String getText(String redirectLocation) {
HttpGet httpget = new HttpGet(redirectLocation);
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
responseBody = httpclient.execute(httpget, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httpget.abort();
}
return responseBody;
}
} 查看全部
一、什么是Simsimi?

simsimi公司是提供智能服务,其中一个服务是simsimi聊天机器人服务,每天有超过百万的用户聊天,国内最大的搜索引擎——百度的产品siri使用的就是simsimi提供的api。

你可以在网址http://www.simsimi.com/talk.htm# 进行体验

SimSimi inc. is specialized in collective intelligence service. All kinds of services we provide generates unique entertainment and values through systemized collective intelligence.

One of our services, a chatting robot SimSimi exceeds the limitation of technology of natural-language processing system by collective intelligence and it has a chat with over millions user per day. Our Premium knowledge providing service “Jisikman” creates millions of valuable knowledges a day.

We invite you to our realm of service which is available through our cloud of collective intelligence, Crowd Cloud that SimSimi inc. creates.

二、Simsimi小黄鸡API

在去年的这个时候,小黄鸡的非官方api一度被大家疯狂的在微信公众号上使用,一时间不知道成就了多少微信营销号,同时,华科某位大四学生利用这个api,结合人人网开发平台,制作了一个小黄鸡的人人号,@小黄鸡之后,就可以利用api自动进行回复,是的这个人人号瞬间粉丝陡增。

然而大家使用的都是非官方的API,所谓非官方,就是不是simsimi公司提供的合法使用途径,API大致的原理是利用编程语言,模拟浏览器发送post请求到http://www.simsimi.com/talk.htm# 链接,解析响应,然后作成相关的小黄鸡API。这个方法后来被我在本博客中在博文中发布,导致使用人数激增,simsimi公司似乎察觉了什么,立马对这种模拟请求的方式做出了屏蔽,一旦某ip请求数量和频率超过限制,则终端对它的请求。正式官方对非法API的封锁,也使用国内的开发这关注到之前并不出名的小i机器人,同样使用语言模拟请求web聊天界面,时间没有过很久,这个页面就加入了图片验证码防止程序模拟。

至此,两个聊天机器人都走上了收费的道路...准确的说,应该是被这帮子开发者赶上了收费的道路,因为他们给它带来了知名度。

三、SimsimiAPI使用
13845160832840.jpg

目前,小黄鸡API已经公然收费(http://developer.simsimi.com/api
不过,和之前一样,会给注册用户提供30天的试用API。
API请求链接为:
Trial-key    http://sandbox.api.simsimi.com/request.p
Paid-key    http://api.simsimi.com/request.p

API请求参数见官网。
 
API返回格式为:

result:100-ok. 400-Bad Request. 401-Unauthorized. 404-Not found. 500-Server Error.    返回的code

id:Response id. (you can get only if returning result is 100)回复的id,由系统生成,当请求成功返回时才有这个字段。 

response:Response message(you can get only if returning result is 100)返回的回复内容。

msg:Result  msg(Description of result code) 返回的code对应的含义

四、Simsimi使用举例

请求举例:

Trial-key    http://sandbox.api.simsimi.com ... %3Dhi   
Paid-key    http://api.simsimi.com/request ... %3Dhi

响应举例:

{ "result": 100, "response": "Who are you?!", "id": 13185569, "msg": "OK." }

五、如何免费的使用Simsimi API

我想,大家都懂了,写这篇文章的原因就是很多人搜索小黄鸡 api到我的博客,我想大家都是要找免费的小黄鸡API。这里提供给大家一个思路:
 
合作伙伴中,有人人网,为什么?本博文前面提高某大四学生做了一个人人号,@小黄鸡之后,会自动进行回复,他使用的就是simsimi的官方正版付费API,既然人人网提供开发平台,可以对帐号进行回复,获得回复等等操作,为什么不能使用程序,登录帐号,然后@小黄鸡,然后获得它的回复,再返回给你自己的用户呢?答案当然是可以的!!!

下面贴出一段可供参考的Java代码,之所以为仅供参考,就是说只能参考思路,代码运行是运行不起来的!!!如果能够帮助到你,希望回复点评一下,并点点广告,你懂的...
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
/**
* 利用httpclient操作人人网 比如登陆,发状态,模拟你访问任何人主页等等
* @author: http://50vip.com
*
*/
public class RenRen {
private String userName = "";
private String password = "";

private static String redirectURL = "http://www.renren.com/home";
private static String renRenLoginURL = "http://www.renren.com/PLogin.do";
private static String talkUrl = "http://photo.renren.com/photo/ ... 3B%3B
private HttpResponse response;
private DefaultHttpClient httpclient = null;
private String requestToken = null;
private String _rtk = null;

public RenRen(String userName, String password) {
this.userName = userName;
this.password = password;
}

public static void main(String[] args) {
RenRen rr = null;
rr = new RenRen("xxxxx@hotmail.com", "yyyyy");
rr.login();
System.out.println(rr.talk("820"));
}
/**
* 登陆
* @author: http://50vip.com
* @return
*/
public boolean login() {
if (httpclient != null) {
return true;
}
httpclient = null;
httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("origURL", redirectURL));
nvps.add(new BasicNameValuePair("domain", "renren.com"));
nvps.add(new BasicNameValuePair("autoLogin", "true"));
nvps.add(new BasicNameValuePair("formName", ""));
nvps.add(new BasicNameValuePair("method", ""));
nvps.add(new BasicNameValuePair("submit", "登录"));
nvps.add(new BasicNameValuePair("email", userName));
nvps.add(new BasicNameValuePair("password", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
//System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();
}

String redirectLocation = getRedirectLocation();
if (redirectLocation != null) {
// 跳到首页,登录完成
String indexHtml=getText(redirectLocation);

//获取requestToken get_check:'-2062261917'
Pattern pattern1 = Pattern.compile("get_check:'(.*)',get_check_x");
Matcher m1 = pattern1.matcher(indexHtml);
if (m1.find()) {
requestToken=m1.group(1);
} else {
System.out.println("获取requestToken失败!");
}

//"获取_rtk失败!"get_check_x:'50d55fbd'
Pattern pattern2 = Pattern.compile("get_check_x:'(.*)',env:");
Matcher m2 = pattern2.matcher(indexHtml);
if (m2.find()) {
_rtk=m2.group(1);
} else {
System.out.println("获取_rtk失败!");
}
}
return true;
}

/**
* 和人人的小黄鸡交谈
* @author: http://50vip.com
* @param msg
* @return
*/
public String talk(String msg) {
String repMsg="";//小黄的回复

HttpPost httpost = new HttpPost(talkUrl);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("_rtk", _rtk));
nvps.add(new BasicNameValuePair("requestToken", requestToken));
nvps.add(new BasicNameValuePair("message", msg));

try {
ResponseHandler<String> responseHandler = new BasicResponseHandler();
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
repMsg=httpclient.execute(httpost, responseHandler);
} catch (Exception e) {
e.printStackTrace();
} finally {
httpost.abort();
}
return repMsg;
}

/**
* 此处人人网会302跳转
* @author: http://50vip.com
* @return
*/
private String getRedirectLocation() {
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
}

/**
* 读取首页内容
* @author: http://50vip.com
* @param redirectLocation
* @return
*/
private String getText(String redirectLocation) {
HttpGet httpget = new HttpGet(redirectLocation);
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
responseBody = httpclient.execute(httpget, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httpget.abort();
}
return responseBody;
}
}

使用Java给微信公众号创建自定义的菜单

编程语言atool 发表了文章 • 0 个评论 • 1260 次浏览 • 2016-04-22 12:53 • 来自相关话题

最近一段时间,微信公众平台做了很多的改进啊~

微信目前将公众帐号分成服务号和订阅号两种,之前的微信公众号默认为订阅号,不过有一次机会可以自由选择,两者之间各有优劣:

服务号每月只能推送一条消息,不过消息是显示在消息列表中,并有消息提示;订阅号每天有一条消息推送,不过消息不显示在消息列表,没有消息提示。

除此之外,目前微信公众号可以自定义菜单,下面将介绍如果使用Java作一个微信公众号的菜单,参考API可到官网查看:http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E6%8E%A5%E5%8F%A3
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.JSONObject;

public class MenuUtil {
/**
* 获得ACCESS_TOKEN
* @Title: getAccess_token
* @Description: 获得ACCESS_TOKEN
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
private static String getAccess_token(){

String APPID="";
String APPSECRET="";

String url = "https://api.weixin.qq.com/cgi- ... 3B%2B APPID + "&secret=" +APPSECRET;
String accessToken = null;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();

http.setRequestMethod("GET"); //必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

http.connect();

InputStream is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");

JSONObject demoJson = new JSONObject(message);
accessToken = demoJson.getString("access_token");

System.out.println(message);
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}

/**
* 创建Menu
* @Title: createMenu
* @Description: 创建Menu
* @param @return
* @param @throws IOException 设定文件
* @return int 返回类型
* @throws
*/
public static String createMenu() {
String menu = "{\"button\":[{\"type\":\"click\",\"name\":\"MENU01\",\"key\":\"1\"},{\"type\":\"click\",\"name\":\"天气查询\",\"key\":\"西安\"},{\"name\":\"日常工作\",\"sub_button\":[{\"type\":\"click\",\"name\":\"待办工单\",\"key\":\"01_WAITING\"},{\"type\":\"click\",\"name\":\"已办工单\",\"key\":\"02_FINISH\"},{\"type\":\"click\",\"name\":\"我的工单\",\"key\":\"03_MYJOB\"},{\"type\":\"click\",\"name\":\"公告消息箱\",\"key\":\"04_MESSAGEBOX\"},{\"type\":\"click\",\"name\":\"签到\",\"key\":\"05_SIGN\"}]}]}";

//此处改为自己想要的结构体,替换即可
String access_token= getAccess_token();

String action = "https://api.weixin.qq.com/cgi- ... en%3B
try {
URL url = new URL(action);
HttpURLConnection http = (HttpURLConnection) url.openConnection();

http.setRequestMethod("POST");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

http.connect();
OutputStream os= http.getOutputStream();
os.write(menu.getBytes("UTF-8"));//传入参数
os.flush();
os.close();

InputStream is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");
return "返回信息"+message;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "createMenu 失败";
}

/**
* 删除当前Menu
* @Title: deleteMenu
* @Description: 删除当前Menu
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String deleteMenu()
{
String access_token= getAccess_token();
String action = "https://api.weixin.qq.com/cgi-bin/menu/delete? access_token="+access_token;
try {
URL url = new URL(action);
HttpURLConnection http = (HttpURLConnection) url.openConnection();

http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

http.connect();
OutputStream os= http.getOutputStream();
os.flush();
os.close();

InputStream is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");
return "deleteMenu返回信息:"+message;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "deleteMenu 失败";
}

public static void main(String[] args) {
System.out.println(createMenu());
}
}代码来源于:http://www.oschina.net/code/snippet_945711_24355 ,后续会做PHP版,并加入到自己的微信公众号上面,我的微信公众号二维码见右侧。Enjoy~ 查看全部
最近一段时间,微信公众平台做了很多的改进啊~

微信目前将公众帐号分成服务号和订阅号两种,之前的微信公众号默认为订阅号,不过有一次机会可以自由选择,两者之间各有优劣:

服务号每月只能推送一条消息,不过消息是显示在消息列表中,并有消息提示;订阅号每天有一条消息推送,不过消息不显示在消息列表,没有消息提示。

除此之外,目前微信公众号可以自定义菜单,下面将介绍如果使用Java作一个微信公众号的菜单,参考API可到官网查看:http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E6%8E%A5%E5%8F%A3
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.json.JSONObject;

public class MenuUtil {
/**
* 获得ACCESS_TOKEN
* @Title: getAccess_token
* @Description: 获得ACCESS_TOKEN
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
private static String getAccess_token(){

String APPID="";
String APPSECRET="";

String url = "https://api.weixin.qq.com/cgi- ... 3B%2B APPID + "&secret=" +APPSECRET;
String accessToken = null;
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();

http.setRequestMethod("GET"); //必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

http.connect();

InputStream is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");

JSONObject demoJson = new JSONObject(message);
accessToken = demoJson.getString("access_token");

System.out.println(message);
} catch (Exception e) {
e.printStackTrace();
}
return accessToken;
}

/**
* 创建Menu
* @Title: createMenu
* @Description: 创建Menu
* @param @return
* @param @throws IOException 设定文件
* @return int 返回类型
* @throws
*/
public static String createMenu() {
String menu = "{\"button\":[{\"type\":\"click\",\"name\":\"MENU01\",\"key\":\"1\"},{\"type\":\"click\",\"name\":\"天气查询\",\"key\":\"西安\"},{\"name\":\"日常工作\",\"sub_button\":[{\"type\":\"click\",\"name\":\"待办工单\",\"key\":\"01_WAITING\"},{\"type\":\"click\",\"name\":\"已办工单\",\"key\":\"02_FINISH\"},{\"type\":\"click\",\"name\":\"我的工单\",\"key\":\"03_MYJOB\"},{\"type\":\"click\",\"name\":\"公告消息箱\",\"key\":\"04_MESSAGEBOX\"},{\"type\":\"click\",\"name\":\"签到\",\"key\":\"05_SIGN\"}]}]}";

//此处改为自己想要的结构体,替换即可
String access_token= getAccess_token();

String action = "https://api.weixin.qq.com/cgi- ... en%3B
try {
URL url = new URL(action);
HttpURLConnection http = (HttpURLConnection) url.openConnection();

http.setRequestMethod("POST");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

http.connect();
OutputStream os= http.getOutputStream();
os.write(menu.getBytes("UTF-8"));//传入参数
os.flush();
os.close();

InputStream is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");
return "返回信息"+message;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "createMenu 失败";
}

/**
* 删除当前Menu
* @Title: deleteMenu
* @Description: 删除当前Menu
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String deleteMenu()
{
String access_token= getAccess_token();
String action = "https://api.weixin.qq.com/cgi-bin/menu/delete? access_token="+access_token;
try {
URL url = new URL(action);
HttpURLConnection http = (HttpURLConnection) url.openConnection();

http.setRequestMethod("GET");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

http.connect();
OutputStream os= http.getOutputStream();
os.flush();
os.close();

InputStream is =http.getInputStream();
int size =is.available();
byte[] jsonBytes =new byte[size];
is.read(jsonBytes);
String message=new String(jsonBytes,"UTF-8");
return "deleteMenu返回信息:"+message;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "deleteMenu 失败";
}

public static void main(String[] args) {
System.out.println(createMenu());
}
}
代码来源于:http://www.oschina.net/code/snippet_945711_24355 ,后续会做PHP版,并加入到自己的微信公众号上面,我的微信公众号二维码见右侧。Enjoy~

amcharts图表避免遮挡或重叠横坐标值斜着、竖着、间隔显示

前端开发atool 发表了文章 • 0 个评论 • 847 次浏览 • 2016-04-22 12:49 • 来自相关话题

amCharts是一个致力于图表组件开发的公司,公司地址在立陶宛首都维尔纽斯,2004年开始推出图表和地图组件。截至目前,amCharts提供了JavaScript/HTML5 Charts、Javascript/HTML5 Stock Chart、JavaScript Maps三种图表组件。amCharts图形效果炫丽,得到了广大使用者的青睐,amCharts的用户遍布全球各地,不乏Microsoft, Cisco, NASA, Motorola之类的行业巨头。

amCharts在1.x版本是基于flash实现,目前2.x版本改为Javascript/HTML5实现,显得更轻量。效果如下所示:




 
针对问题:amcharts图表避免遮挡或重叠横坐标值斜着、竖着、间隔显示,如下所示:categoryAxis.labelRotation = 90; //竖着显示
categoryAxis.labelRotation = 60; //斜着显示
categoryAxis.autoGridCount = false; //自动间隔横坐标显示另外,有时候需要在图表最上面加一个显示区间的滑动条SCROLLBARvar chartScrollbar = new AmCharts.ChartScrollbar();
chart.addChartScrollbar(chartScrollbar); 查看全部
amCharts是一个致力于图表组件开发的公司,公司地址在立陶宛首都维尔纽斯,2004年开始推出图表和地图组件。截至目前,amCharts提供了JavaScript/HTML5 Charts、Javascript/HTML5 Stock Chart、JavaScript Maps三种图表组件。amCharts图形效果炫丽,得到了广大使用者的青睐,amCharts的用户遍布全球各地,不乏Microsoft, Cisco, NASA, Motorola之类的行业巨头。

amCharts在1.x版本是基于flash实现,目前2.x版本改为Javascript/HTML5实现,显得更轻量。效果如下所示:
5351375266081.png

 
针对问题:amcharts图表避免遮挡或重叠横坐标值斜着、竖着、间隔显示,如下所示:
categoryAxis.labelRotation = 90; //竖着显示
categoryAxis.labelRotation = 60; //斜着显示
categoryAxis.autoGridCount = false; //自动间隔横坐标显示
另外,有时候需要在图表最上面加一个显示区间的滑动条SCROLLBAR
var chartScrollbar = new AmCharts.ChartScrollbar();
chart.addChartScrollbar(chartScrollbar);

Flask + gunicorn + nginx 部署Web

服务端atool 发表了文章 • 0 个评论 • 383 次浏览 • 2016-04-22 12:46 • 来自相关话题

现在QA内部很多组都是用Flask做一些web开发,或者接口开发,然而很多应用可能直接使用Python 运行,这个存在很大的性能问题(之前做的AB测试数据)。下面介绍怎么使用Flask + gunicorn + nginx 部署一个Flask应用,实际上网上介绍这个的更多,但是大多偏于复杂,操作难度大。
 
一、准备好Flask应用
就是自己开发的Flask应用,可以使用Python跑起来即可,假设运行方式是python run_demo_flask,使用的端口是8080。
 
二、使用gunicorn
首先安装gunicorn,很简单,没有安装过的,直接:pip install gunicorn
pip install gevent使用gunicorn运行Flask:gunicorn --worker-class=gevent -w 4 -t 30 -b ip:8080 run_demo_flask:app注意:将ip换成你部署的服务器的IP地址,app为flask的实例对象名字。
 
三、使用nginx代理
 
可以将下面的配置放入到nginx的vhost目录,(名字为xxxx.conf,必须以conf结尾),然后重启nginx即可。
重启方式nginx -t # 测试下配置是否正确
service nginx restart # 如果正确就重启3.1 如果有域名,nginx 配置文件如下erver {
listen 80;
server_name xxx.163-inc.com;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}访问方式:http://xxx.163-inc.com

3.2 如果没有域名server {
listen 8081;
server_name ip;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
listen的端口换一个没有使用的端口,然后proxy_pass传入8080(flask_demo的端口)
访问方式:http://ip:8081
 
重启nginx即可完毕。 查看全部
现在QA内部很多组都是用Flask做一些web开发,或者接口开发,然而很多应用可能直接使用Python 运行,这个存在很大的性能问题(之前做的AB测试数据)。下面介绍怎么使用Flask + gunicorn + nginx 部署一个Flask应用,实际上网上介绍这个的更多,但是大多偏于复杂,操作难度大。
 
一、准备好Flask应用
就是自己开发的Flask应用,可以使用Python跑起来即可,假设运行方式是python run_demo_flask,使用的端口是8080。
 
二、使用gunicorn
首先安装gunicorn,很简单,没有安装过的,直接:
pip install gunicorn
pip install gevent
使用gunicorn运行Flask:
gunicorn --worker-class=gevent -w 4 -t 30 -b ip:8080 run_demo_flask:app
注意:将ip换成你部署的服务器的IP地址,app为flask的实例对象名字。
 
三、使用nginx代理
 
可以将下面的配置放入到nginx的vhost目录,(名字为xxxx.conf,必须以conf结尾),然后重启nginx即可。
重启方式
nginx -t  # 测试下配置是否正确
service nginx restart # 如果正确就重启
3.1 如果有域名,nginx 配置文件如下
erver {
listen 80;
server_name xxx.163-inc.com;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
访问方式:http://xxx.163-inc.com

3.2 如果没有域名
server {
listen 8081;
server_name ip;
client_max_body_size 128M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

listen的端口换一个没有使用的端口,然后proxy_pass传入8080(flask_demo的端口)
访问方式:http://ip:8081
 
重启nginx即可完毕。

Python minidom去除xml文本中空行、空格、tab,美化xml显示样式

编程语言atool 发表了文章 • 0 个评论 • 1519 次浏览 • 2016-04-22 12:37 • 来自相关话题

使用Python minidom的库函数进行xml文件或者文本的增加借点、删除借点、增加属性、删除属性、合并xml文件或者文本等这些操作的时候,往往多多出很多的空行,使用toxml()方法返回字符串保存到文件之后,空行依然存在,非常不美观,下面使用python介绍怎么去除xml文本中空行、空格、tab,美化xml显示样式,代码如下:
@classmethod
def _beautifulFormat(self, xmlDomObject):
'''美化xml格式
'''
if xmlDomObject:
#优化格式显示
xmlStr = xmlDomObject.toprettyxml(indent = '', newl = '', encoding = 'utf-8')
xmlStr = xmlStr.replace('\t', '').replace('\n', '')
xmlDomObject = minidom.parseString(xmlStr)
xmlStr = xmlDomObject.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8')

return xmlStr
else:
return False这个是写到一个类中的静态方法,传入参数为minidom中的xml Object对象,返回的是格式化美化之后的xml文本。

大致思路是首先去掉xml中的所有空行、tab,然后在用minidom读入没有空行,tab的xml文本,然后再使用toprettyxml()方法格式化输出字符串。

自己在程序中使用,没有任何问题,如有问题请留言,如果帮助到你,请点点广告,你懂的~ 查看全部
使用Python minidom的库函数进行xml文件或者文本的增加借点、删除借点、增加属性、删除属性、合并xml文件或者文本等这些操作的时候,往往多多出很多的空行,使用toxml()方法返回字符串保存到文件之后,空行依然存在,非常不美观,下面使用python介绍怎么去除xml文本中空行、空格、tab,美化xml显示样式,代码如下:
 @classmethod
def _beautifulFormat(self, xmlDomObject):
'''美化xml格式
'''
if xmlDomObject:
#优化格式显示
xmlStr = xmlDomObject.toprettyxml(indent = '', newl = '', encoding = 'utf-8')
xmlStr = xmlStr.replace('\t', '').replace('\n', '')
xmlDomObject = minidom.parseString(xmlStr)
xmlStr = xmlDomObject.toprettyxml(indent = '\t', newl = '\n', encoding = 'utf-8')

return xmlStr
else:
return False
这个是写到一个类中的静态方法,传入参数为minidom中的xml Object对象,返回的是格式化美化之后的xml文本。

大致思路是首先去掉xml中的所有空行、tab,然后在用minidom读入没有空行,tab的xml文本,然后再使用toprettyxml()方法格式化输出字符串。

自己在程序中使用,没有任何问题,如有问题请留言,如果帮助到你,请点点广告,你懂的~

Java模拟登录微信公众平台,主动推送图文消息给用户

服务端atool 发表了文章 • 0 个评论 • 1257 次浏览 • 2016-04-22 11:37 • 来自相关话题

@2013-11-25,对博文进行说明,由于2013年10月底,微信公众平台界面完全改版,所以本博文的所有代码几乎全部不能使用,不过有网友对本博的代码进行修改并授权于我共享给大家,因此大家可以去看博文《【微信公众平台改版后】Java模拟登录微信平台,主动推送消息给用户》,本博文的思路,大家也可以看看进行参考。

很早之前,在博客中发表了关于使用java开发微信公众号接口的程序代码,详细见《微信公众号消息接口开发——Java Servlet开发》,例外利用java做了小黄鸡,小i机器人的微信聊天开发,所以之前很多人问我有关于java开发微信接口的东西~

除此之外,更重要的是:很多人还问我关于微信主动推送消息给用户的问题,我所给出的所有答案都是:微信官方没有给出主动推送的api,所有采用程序记录用户微信id,然后模拟微信接口的请求数据,去请求微信接口中设置的url,这些方法都是不可行的~

不过,要实现主动推送不是不可能的,最简单的一个思路就是使用java模拟登录微信公众平台,然后推送消息消息给用户,不过这种方式有推送限制。

由于问的人比较多,决定把代码放出来,代码还未整理,里面有解析数据可以用正则表达式替换也没做,有需要的可以自己在此基础上修改。如果你觉得有用,并帮助了你,感谢你对我的赞助和支持。
public boolean msgSend(MsgForm form, MsgType type) {
try {
if (!this.isLogin) {
this._login();
}
if (this.isLogin) {
form.setToken(this.token);
PostMethod post = new PostMethod(POST_MSG);
post.setRequestHeader(USER_AGENT_H, USER_AGENT);
post.setRequestHeader(REFERER_H, INDEX_URL);
post.setRequestHeader("Cookie", this.cookiestr);
NameValuePair[] params = null;
Part[] parts = null;
switch (type) {
case TEXT:

parts = new Part[]{
new StringPart("content", form.getContent(),
"UTF-8"),
new StringPart("type", form.getType()),
new StringPart("error", form.getError()),
new StringPart("needcomment", form.getNeedcomment()),
new StringPart("groupid", form.getGroupid()),
new StringPart("sex", form.getSex()),
new StringPart("country", form.getCountry()),
new StringPart("province", form.getProvince()),
new StringPart("city", form.getCity()),
new StringPart("token", form.getToken()),
new StringPart("ajax", form.getAjax()),
new StringPart("t", "ajax-response")};
break;
case IMAGE_TEXT:
parts = new Part[]{
new StringPart("content", form.getContent(),
"UTF-8"),
new StringPart("type", form.getType()),
new StringPart("error", form.getError()),
new StringPart("needcomment", form.getNeedcomment()),
new StringPart("groupid", form.getGroupid()),
new StringPart("sex", form.getSex()),
new StringPart("country", form.getCountry()),
new StringPart("province", form.getProvince()),
new StringPart("city", form.getCity()),
new StringPart("token", form.getToken()),
new StringPart("ajax", form.getAjax()),
new StringPart("t", "ajax-response")};
break;
default:
parts = new Part[]{
new StringPart("content", form.getContent(),
"UTF-8"),
new StringPart("type", form.getType()),
new StringPart("error", form.getError()),
new StringPart("needcomment", form.getNeedcomment()),
new StringPart("groupid", form.getGroupid()),
new StringPart("sex", form.getSex()),
new StringPart("country", form.getCountry()),
new StringPart("province", form.getProvince()),
new StringPart("city", form.getCity()),
new StringPart("token", form.getToken()),
new StringPart("ajax", form.getAjax()),
new StringPart("t", "ajax-response")};
break;
}
RequestEntity entity = new MultipartRequestEntity(parts,
post.getParams());
post.setRequestEntity(entity);
int status;
status = client.executeMethod(post);
if (status == HttpStatus.SC_OK) {
String text = post.getResponseBodyAsString();
try {
MsgJson ret = JSON.parseObject(text, MsgJson.class);
this.msgSendCode = ret.getRet();
switch (this.msgSendCode) {
case 0:
this.msgSendMsg = "发送成功";
return true;
case -2:
this.msgSendMsg = "参数错误,请仔细检查";
return false;
case 64004:
this.msgSendMsg = "今天的群发数量已到,无法群发";
return false;
case -20000:
this.msgSendMsg = "请求被禁止,请仔细检查token是否合法";
return false;
default:
this.msgSendMsg = "未知错误!";
return false;
}
} catch (Exception e) {
String info = "【群发信息失败】【解析json错误】" + e.getMessage()
+ "
【文本:】
" + text;
System.err.println(info);
log.debug(info);
log.info(info);
return false;
}
}
}
} catch (Exception e) {
String info = "【群发信息失败】" + e.getMessage();
System.err.println(info);
log.debug(info);
log.info(info);
return false;
}
return false;
} 查看全部
@2013-11-25,对博文进行说明,由于2013年10月底,微信公众平台界面完全改版,所以本博文的所有代码几乎全部不能使用,不过有网友对本博的代码进行修改并授权于我共享给大家,因此大家可以去看博文《【微信公众平台改版后】Java模拟登录微信平台,主动推送消息给用户》,本博文的思路,大家也可以看看进行参考。

很早之前,在博客中发表了关于使用java开发微信公众号接口的程序代码,详细见《微信公众号消息接口开发——Java Servlet开发》,例外利用java做了小黄鸡,小i机器人的微信聊天开发,所以之前很多人问我有关于java开发微信接口的东西~

除此之外,更重要的是:很多人还问我关于微信主动推送消息给用户的问题,我所给出的所有答案都是:微信官方没有给出主动推送的api,所有采用程序记录用户微信id,然后模拟微信接口的请求数据,去请求微信接口中设置的url,这些方法都是不可行的~

不过,要实现主动推送不是不可能的,最简单的一个思路就是使用java模拟登录微信公众平台,然后推送消息消息给用户,不过这种方式有推送限制。

由于问的人比较多,决定把代码放出来,代码还未整理,里面有解析数据可以用正则表达式替换也没做,有需要的可以自己在此基础上修改。如果你觉得有用,并帮助了你,感谢你对我的赞助和支持。
public boolean msgSend(MsgForm form, MsgType type) {
try {
if (!this.isLogin) {
this._login();
}
if (this.isLogin) {
form.setToken(this.token);
PostMethod post = new PostMethod(POST_MSG);
post.setRequestHeader(USER_AGENT_H, USER_AGENT);
post.setRequestHeader(REFERER_H, INDEX_URL);
post.setRequestHeader("Cookie", this.cookiestr);
NameValuePair[] params = null;
Part[] parts = null;
switch (type) {
case TEXT:

parts = new Part[]{
new StringPart("content", form.getContent(),
"UTF-8"),
new StringPart("type", form.getType()),
new StringPart("error", form.getError()),
new StringPart("needcomment", form.getNeedcomment()),
new StringPart("groupid", form.getGroupid()),
new StringPart("sex", form.getSex()),
new StringPart("country", form.getCountry()),
new StringPart("province", form.getProvince()),
new StringPart("city", form.getCity()),
new StringPart("token", form.getToken()),
new StringPart("ajax", form.getAjax()),
new StringPart("t", "ajax-response")};
break;
case IMAGE_TEXT:
parts = new Part[]{
new StringPart("content", form.getContent(),
"UTF-8"),
new StringPart("type", form.getType()),
new StringPart("error", form.getError()),
new StringPart("needcomment", form.getNeedcomment()),
new StringPart("groupid", form.getGroupid()),
new StringPart("sex", form.getSex()),
new StringPart("country", form.getCountry()),
new StringPart("province", form.getProvince()),
new StringPart("city", form.getCity()),
new StringPart("token", form.getToken()),
new StringPart("ajax", form.getAjax()),
new StringPart("t", "ajax-response")};
break;
default:
parts = new Part[]{
new StringPart("content", form.getContent(),
"UTF-8"),
new StringPart("type", form.getType()),
new StringPart("error", form.getError()),
new StringPart("needcomment", form.getNeedcomment()),
new StringPart("groupid", form.getGroupid()),
new StringPart("sex", form.getSex()),
new StringPart("country", form.getCountry()),
new StringPart("province", form.getProvince()),
new StringPart("city", form.getCity()),
new StringPart("token", form.getToken()),
new StringPart("ajax", form.getAjax()),
new StringPart("t", "ajax-response")};
break;
}
RequestEntity entity = new MultipartRequestEntity(parts,
post.getParams());
post.setRequestEntity(entity);
int status;
status = client.executeMethod(post);
if (status == HttpStatus.SC_OK) {
String text = post.getResponseBodyAsString();
try {
MsgJson ret = JSON.parseObject(text, MsgJson.class);
this.msgSendCode = ret.getRet();
switch (this.msgSendCode) {
case 0:
this.msgSendMsg = "发送成功";
return true;
case -2:
this.msgSendMsg = "参数错误,请仔细检查";
return false;
case 64004:
this.msgSendMsg = "今天的群发数量已到,无法群发";
return false;
case -20000:
this.msgSendMsg = "请求被禁止,请仔细检查token是否合法";
return false;
default:
this.msgSendMsg = "未知错误!";
return false;
}
} catch (Exception e) {
String info = "【群发信息失败】【解析json错误】" + e.getMessage()
+ "
【文本:】
" + text;
System.err.println(info);
log.debug(info);
log.info(info);
return false;
}
}
}
} catch (Exception e) {
String info = "【群发信息失败】" + e.getMessage();
System.err.println(info);
log.debug(info);
log.info(info);
return false;
}
return false;
}