這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
公眾號開發中,需要發送http請求來設定菜單。寫了一個程式放在這裡,避免每次用postman發請求的麻煩。
需要在程式目錄下面放置menu.txt檔案,內容就是公眾號開發中菜單的json格式,比如:
{ "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" }, { "name":"菜單", "sub_button":[ { "type":"view", "name":"搜尋", "url":"http://www.soso.com/" }, { "type":"view", "name":"視頻", "url":"http://v.qq.com/" }, { "type":"click", "name":"贊一下我們", "key":"V1001_GOOD" }] }] }
golang代碼如下:
package mainimport ("bytes""encoding/json""flag""fmt""io/ioutil""net/http""os")const (WX_ID = "xxxxxxxx"WX_SECRECT = "xxxxxxxxxxxxxxxxxxxxxxxx"REQ_TOEKN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"GET_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=%s"SET_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s")func readMenu(path string) []byte {fi, err := os.Open(path)if err != nil {fmt.Println("read file error:", err)return nil}defer fi.Close()fd, err := ioutil.ReadAll(fi)if err != nil {fmt.Println("read menu file error:", err)return nil}return fd}func GetToken() string {url := fmt.Sprintf(REQ_TOEKN_URL, WX_ID, WX_SECRECT)resp, err := http.Get(url)if err != nil {fmt.Println("get token failed")return ""}defer resp.Body.Close()decoder := json.NewDecoder(resp.Body)var retMap map[string]interface{}err = decoder.Decode(&retMap)if nil != err {bodySlice, err := ioutil.ReadAll(resp.Body)fmt.Println("json decode error:", err, string(bodySlice))return ""}token, ok := retMap["access_token"].(string)if !ok {fmt.Println("ret package error:", retMap)return ""}return token}func SetMenu(file string, token string) bool {menuSlice := readMenu(file)if nil == menuSlice {return false}url := fmt.Sprintf(SET_MENU_URL, token)req, err := http.NewRequest("POST", url, bytes.NewReader(menuSlice))if nil != err {fmt.Println("new http request error:", err)return false}client := &http.Client{}resp, err := client.Do(req)if nil != err {fmt.Println("http client do error:", err)return false}defer resp.Body.Close()decoder := json.NewDecoder(resp.Body)var retMap map[string]interface{}err = decoder.Decode(&retMap)if nil != err {bodySlice, err := ioutil.ReadAll(resp.Body)fmt.Println("json decode error:", err, string(bodySlice))return false}fmt.Println("set menu ret:", retMap)return true}func GetMenu(token string) {url := fmt.Sprintf(GET_MENU_URL, token)resp, err := http.Get(url)if nil != err {fmt.Println("http get error:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("read http body error:", err)return}var menuMap map[string]interface{}err = json.Unmarshal(body, &menuMap)if err != nil {fmt.Println("json decode menu failed:", err)return}menuIndent, err := json.MarshalIndent(menuMap, "", " ")if err != nil {fmt.Println("json encode format failed:", err)return}fmt.Println("menu info:")fmt.Println(string(menuIndent))}func main() {menuFile := flag.String("menu", "menu.txt", "menu file path")setMenu := flag.String("set", "yes", "need to set menu")flag.Parse()accessToken := GetToken()if "" == accessToken {fmt.Println("get accecss token failed")return}if "yes" == *setMenu {SetMenu(*menuFile, accessToken)}GetMenu(accessToken)}
python代碼如下:
import jsonimport urllib2import requestsimport getoptimport syswxid = "xxxxxxxx"wxsecrect = "xxxxxxxxxxxxxxxxxxxxxx"reqTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"getMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=%s"setMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s"def main(argv):try:opts, args = getopt.getopt(argv, "hr", ["help", "read"])except getopt.GetoptError:usage()sys.exit(2)needSet = Truefor opt, arg in opts:if opt in ("-h", "--help"):usage()sys.exit()elif opt in ("-r", "--read"):needSet = FalsefileObj = open("menu.txt")try:menuText = fileObj.read()finally:fileObj.close()url = reqTokenUrl % (wxid, wxsecrect)retStr = urllib2.urlopen(url).read()ret = json.loads(retStr)token = ret["access_token"]if needSet:url = setMenuUrl % tokenresp = requests.post(url, data=menuText)print resp.texturl = getMenuUrl % tokenretStr = urllib2.urlopen(url).read()print retStrif __name__ == "__main__":main(sys.argv[1:])
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。