使用Python编写一个在Linux下实现截图分享的脚本的教程


Posted in Python onApril 24, 2015

引子

Linux下不支持QQ等功能丰富的IM,虽然可以通过wine运行QQ2012,但是还是喜欢在gtalk群中聊天,gtalk群不支持图片方式,这就要靠我们大家自己来解决了,eleven开放了一个Image上传和显示接口,提供了使用curl来解决,但是我们公司的网络使用squid禁止了curl的访问,所以整天看他们这么爽的分享图片我也不甘心阿,所以就使用Python写了一个分享图片的脚本
实现

使用scrot截图,然后使用urllib2库上传图片,如果存在PyQt4库则会将结果放到剪贴板上,如果不存在则输出,自行复制
代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : cold
# E-mail : wh_linux@126.com
# Date : 13/01/21 09:54:39
# Desc : 贴代码和图片
#
import urllib2, json
import mimetools
import mimetypes
import itertools

__host__ = "http://eleveni386.7axu.com"

class Form(object):
 def __init__(self):
  self.form_fields = []
  self.files = []
  self.boundary = mimetools.choose_boundary()
  self.content_type = "application/x-www-form-urlencoded"
  return

 def get_content_type(self):
  return self.content_type

 def add_field(self, name, value):
  self.form_fields.append((name, value))
  return

 def add_file(self, fieldname, filename, fileHandle, mimetype=None):
  body = fileHandle.read()
  if mimetype is None:
   mimetype = ( mimetypes.guess_type(filename)[0]
       or
       'applicatioin/octet-stream')
  self.files.append((fieldname, filename, mimetype, body))
  self.content_type = 'multipart/form-data; boundary=%s' % self.boundary

  return

 def __str__(self):
  parts = []
  part_boundary = '--' + self.boundary

  parts.extend(
   [ part_boundary,
    'Content-Disposition: form-data; name="%s"' % name,
    '',
    value,
    ]
   for name, value in self.form_fields)
  if self.files:
   parts.extend([
    part_boundary,
    'Content-Disposition: form-data; name="%s"; filename="%s"' %\
    (field_name, filename),
    'Content-Type: %s' % content_type,
    '',
    body,
   ] for field_name, filename, content_type, body in self.files)

  flattened = list(itertools.chain(*parts))
  flattened.append('--' + self.boundary + '--')
  flattened.append('')
  return '\r\n'.join(flattened)


class HttpHelper(object):
 def __init__(self, url = None, form = None, method = 'GET'):
  self._url = url
  self._form = form
  self._body = str(form)
  self._method = method
  self._dst_url = None
  if url:
   self.make_request()

 def make_request(self):
  url = self._url
  if not self._url.startswith('http://'):
   url = 'http://' + self._url
  self.request = urllib2.Request(url)
  if self._form:
   self.add_header("Content-Type", self._form.get_content_type())
   self.add_header("Content-Length", len(self._body))
   self.request.add_data(self._body)

 def add_header(self, key, val):
  self.request.add_header(key, val)

 def change(self, url, params = {}, method = 'GET'):
  self._url = url
  self._params = params
  self._method = method
  self.make_request()

 def open(self):
  response = urllib2.urlopen(self.request)
  content = response.read()
  self._dst_url = response.geturl()
  try:
   return json.loads(content)
  except:
   return content

if __name__ == "__main__":
 import argparse
 import os
 parser = argparse.ArgumentParser()
 parser.add_argument(dest="path", nargs="?")
 args = parser.parse_args()
 if args.path:
  path = args.path
 else:
  path = r"/tmp/tmpscrot.png"
  os.system("scrot -s {0}".format(path))
 form = Form()
 filename = os.path.split(path)[-1]
 form.add_file(fieldname='mypic', filename=filename,
     fileHandle=open(path))
 http = HttpHelper( __host__ + '/Image/', form)
 url = http.open()
 try:
  from PyQt4.QtGui import QApplication
  app = QApplication([])
  cb = QApplication.clipboard()
  cb.setText(url)
 except:
  print url

安装

将上面代码保存一个文件,放在PATH路径里,赋予执行权限即可
使用

默认的不跟图片地址则会截图,截图完毕后自动分享,如安装了PyQt4库则会将结果放到剪贴板,如没有则输出结果.如果脚本给了图片路径参数则上传给定路径的图片

Python 相关文章推荐
python集合类型用法分析
Apr 08 Python
python实现网站的模拟登录
Jan 04 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Python pandas如何向excel添加数据
May 22 Python
python的setattr函数实例用法
Dec 16 Python
Python 使用dict实现switch的操作
Apr 07 Python
Python 文本滚动播放器的实现代码
Apr 25 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 #Python
Python的Tornado框架异步编程入门实例
Apr 24 #Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 #Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 #Python
简单说明Python中的装饰器的用法
Apr 24 #Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 #Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 #Python
You might like
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
php中取得URL的根域名的代码
2011/03/23 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
关于COOKIE个数与大小的问题
2011/01/17 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python实现五子棋游戏
2019/06/18 Python
python地震数据可视化详解
2019/06/18 Python
NumPy中的维度Axis详解
2019/11/26 Python
详解python polyscope库的安装和例程
2020/11/13 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
几道Java和数据库的面试题
2013/05/30 面试题
校园元旦活动总结
2014/07/09 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书