使用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的randrange()方法使用教程
May 15 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
详解Python import方法引入模块的实例
Aug 02 Python
解决Django migrate No changes detected 不能创建表的问题
May 27 Python
python实现定时提取实时日志程序
Jun 22 Python
python numpy 按行归一化的实例
Jan 21 Python
python给微信好友定时推送消息的示例
Feb 20 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
python安装及变量名介绍详解
Dec 12 Python
python字典按照value排序方法
Dec 28 Python
python装饰器代码深入讲解
Mar 01 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
php过滤危险html代码
2008/08/18 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
dwr spring的集成实现代码
2009/03/22 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
详解tween.js的使用教程
2017/09/14 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
python实现俄罗斯方块
2018/06/26 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
python爬虫超时的处理的实例
2018/12/19 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
广告学毕业生求职信
2014/01/30 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
投标承诺书怎么写
2014/05/24 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
公司委托书范本5篇
2014/09/20 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
python plt.plot bar 如何设置绘图尺寸大小
2021/06/01 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android