python3 生成图表png发送给钉钉群

tangowp251 2018-02-12 02:41:34
代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import subprocess
import urllib.request
import urllib.parse
import json
import sys
import socket
import ssl
import array
import matplotlib as mpl
mpl.use('Agg')
import numpy as np
import matplotlib.pyplot as plt #导入Matplotlib
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers

#文件上传接口
url2='https://oapi.dingtalk.com/media/upload'
mycorpid='dingdsjkflajsdfjadfkl;ajf;klasdf'
mycorpsecret='jsf;kljdafajsdfkasdjf;a'

x=np.linspace(0,10,1000)
y=np.sin(x) +1 #因变量y
z=np.cos(x**2)+1 #因变量z

plt.figure(figsize=(8,4)) #设置图像大小
plt.plot(x,y,label='$\sin x+1$', color = 'red' ,linewidth = 2) #作图,设置标签、线条颜色、线条大小
plt.plot(x,z,'b--',label = '$\cos x^2+1$' ) #作图,设置标签 、线条类型
plt.xlabel('Time(s)') #X轴名称
plt.ylabel('Volt') #Y轴名称
plt.title('A Sample Example') #标题
plt.ylim(0,2.2) #显示的y轴范围
plt.legend() # 显示图例
plt.savefig('c.png')
plt.show() # 显示作图结果


#获取token
def get_access_token():
url = 'https://oapi.dingtalk.com/gettoken?corpid=%s&corpsecret=%s' % (mycorpid, mycorpsecret)
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
response_str = response.read()
#print (json.loads(response_str))
response_dict = json.loads(response_str)
error_code_key = "errcode"
access_token_key = "access_token"
#if response_dict.has_key(error_code_key) and response_dict[error_code_key] == 0 and response_dict.has_key(access_token_key):
if response_dict[error_code_key] == 0 :
return response_dict[access_token_key]
else:
return ''

def send_file_to_users(nowtoken, users, file_name):
media_id = upload_file(nowtoken, file_name)
if media_id == '':
return
msg_type, msg = _gen_file_msg(media_id)
return _send_msg_to_users(nowtoken, users, msg_type, msg)

def upload_file(nowtoken, file_name):
register_openers()
datagen, headers = multipart_encode({'media': open(file_name, 'rb')})
requst_url = 'https://oapi.dingtalk.com/media/upload?access_token=' + nowtoken + '&type=file'
request = urllib.request.Request(requst_url, datagen, headers)
print (urllib.request.urlopen(request))
response = urllib.request.urlopen(request)
response_str = response.read()
response_dict = json.loads(response_str)
media_id_key = 'media_id'
error_code_key = 'errcode'
if response_dict.has_key(error_code_key) and response_dict[error_code_key] == 0 and response_dict.has_key(media_id_key):
return response_dict[media_id_key]
else:
return ''

def read_file():
try:
fin = open("/home/app/python/test/c.png", "rb")
except IOError:
print ("Error: open file failed." )
return
return fin.read()
fin.close()

#主函数入口
if __name__ == '__main__':
nowtoken=get_access_token()
mess=read_file()
#send_text_to_users(nowtoken,'152234110668931328',mess)
#send_file_to_users(access_token, ‘userid’, file_name)
send_file_to_users(nowtoken, '8989891111', '/home/app/python/test/c.png')
exit(0)

我在centos6.5 下 使用的python3 之前是poster版本有问题 改了python3语法
现在错误信息如下:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/http/client.py", line 1042, in _send_output
memoryview(message_body)
TypeError: memoryview: a bytes-like object is required, not 'multipart_yielder'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/local/lib/python3.6/http/client.py", line 1045, in _send_output
chunks = iter(message_body)
TypeError: iter() returned non-iterator of type 'multipart_yielder'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "3.py", line 96, in <module>
send_file_to_users(nowtoken, '300089', '/home/reno/python/test/c.png')
File "3.py", line 59, in send_file_to_users
media_id = upload_file(nowtoken, file_name)
File "3.py", line 70, in upload_file
print (urllib.request.urlopen(request))
File "/usr/local/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/lib/python3.6/urllib/request.py", line 526, in open
response = self._open(req, data)
File "/usr/local/lib/python3.6/urllib/request.py", line 544, in _open
'_open', req)
File "/usr/local/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.6/urllib/request.py", line 1361, in https_open
context=self._context, check_hostname=self._check_hostname)
File "/usr/local/lib/python3.6/urllib/request.py", line 1318, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "/usr/local/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/local/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/local/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/local/lib/python3.6/http/client.py", line 1049, in _send_output
% type(message_body))
TypeError: message_body should be a bytes-like object or an iterable, got <class 'poster.encode.multipart_yielder'>

请大神指教


...全文
3362 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
echo_susu 2018-02-27
  • 打赏
  • 举报
回复
看报错是你的 message_body 不是正确的类型

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧