使用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 相关文章推荐
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
提升Python效率之使用循环机制代替递归函数
Jul 23 Python
Python django框架开发发布会签到系统(web开发)
Feb 12 Python
Python configparser模块常用方法解析
May 22 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
python 判断一组数据是否符合正态分布
Sep 23 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
详解python网络进程
Jun 15 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
使用swoole扩展php websocket示例
2014/02/13 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
python 实现单通道转3通道
2019/12/03 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
香港礼品网站:GiftU eshop
2017/09/01 全球购物
美国在线医疗分销商:MedEx Supply
2020/02/04 全球购物
新春联欢会主持词
2014/03/24 职场文书
法人授权委托书范本
2014/04/04 职场文书
支教个人总结
2015/03/04 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
初中团支书竞选稿
2015/11/21 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
Mysql 文件配置解析介绍
2022/05/06 MySQL