使用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 数据结构之队列的实现
Jan 22 Python
机器学习的框架偏向于Python的13个原因
Dec 07 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
解决python字典对值(值为列表)赋值出现重复的问题
Jan 20 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
Python如何在循环内使用list.remove()
Jun 01 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
python如何实现word批量转HTML
Sep 30 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实现删除空目录的方法
2015/03/16 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
Python分析学校四六级过关情况
2017/11/22 Python
Python中optparser库用法实例详解
2018/01/26 Python
python中while和for的区别总结
2019/06/28 Python
简单了解python反射机制的一些知识
2019/07/13 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
幼儿园大班教学反思
2014/02/10 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
行政处罚决定书
2015/06/24 职场文书
门面租赁合同范文
2019/08/06 职场文书
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
Python os和os.path模块详情
2022/04/02 Python
python模板入门教程之flask Jinja
2022/04/11 Python