使用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使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 Python
浅析Python编写函数装饰器
Mar 18 Python
使用python爬虫获取黄金价格的核心代码
Jun 13 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
Python单元和文档测试实例详解
Apr 11 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
python:动态路由的Flask程序代码
Nov 22 Python
Python字典fromkeys()方法使用代码实例
Jul 20 Python
Python pickle模块常用方法代码实例
Oct 10 Python
python3 字符串str和bytes相互转换
Mar 23 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 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
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Python多线程编程(八):使用Event实现线程间通信
2015/04/05 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
python 画图 图例自由定义方式
2020/04/17 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
如何定义一个可复用的服务
2014/09/30 面试题
医学护理系毕业生求职信
2013/10/01 职场文书
十八大感想感言
2014/02/10 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
事业单位年度考核评语
2014/12/31 职场文书
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python