<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Python | ばすにっきTips</title>
	<atom:link href="https://takabus.com/tips/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://takabus.com/tips</link>
	<description>プログラミングやサーバー、日々のTipsをメモしています。</description>
	<lastBuildDate>Tue, 17 Mar 2026 23:42:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>

<image>
	<url>https://takabus.com/tips/wp-content/uploads/2022/12/cropped-tips-1-32x32.png</url>
	<title>Python | ばすにっきTips</title>
	<link>https://takabus.com/tips</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PythonでTP-Linkのスマートプラグを制御（Tapo P105）</title>
		<link>https://takabus.com/tips/3785/</link>
					<comments>https://takabus.com/tips/3785/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sun, 15 Mar 2026 09:35:09 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=3785</guid>

					<description><![CDATA[TP-LinkのスマートプラグをPythonで制御する方法をメモしておきます。 準備：ライブラリのインストール Pythonのバージョンは「Python 3.14.3」です。 pipで以下のライブラリをインストールしてお [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p> TP-LinkのスマートプラグをPythonで制御する方法をメモしておきます。</p>



<h2 class="wp-block-heading">準備：ライブラリのインストール</h2>



<p>Pythonのバージョンは「Python 3.14.3」です。</p>



<p>pipで以下のライブラリをインストールしておきます。</p>



<pre class="wp-block-code"><code>pip3 install tapo==0.8.12</code></pre>



<p><a href="https://pypi.org/project/tapo/">tapo · PyPI</a></p>




<a rel="noopener" href="https://pypi.org/project/tapo/" title="tapo" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://pypi.org/static/images/twitter.abaf4b19.webp" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">tapo</div><div class="blogcard-snippet external-blogcard-snippet">Unofficial Tapo API Client. Works with TP-Link Tapo smart devices. Tested with light bulbs (L510, L520, L530, L535, L610...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://pypi.org/project/tapo/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">pypi.org</div></div></div></div></a>



<p class="is-style-information-box has-box-style">今回はTapoというライブラリを使用します。類似ライブラリの「PyP100」は長らくアップデートされておらず、最新のファームウェアに対応していません。</p>



<h2 class="wp-block-heading">スマートプラグのセットアップ</h2>



<p>スマートプラグは事前にTapoアプリに登録し、Tapoアプリで操作できる状態にしておくことが必要です。（いったん登録しておけば、Pythonから制御可能）</p>



<p>また、<span class="red"><span class="marker">スマートプラグのファームウェアが古い場合はアップデートが必要</span></span>です。古いファームウェアでは正常に動作しないことがあります。</p>



<p class="is-style-information-box has-box-style">スマートプラグのバージョンはTapoアプリで確認できます。筆者は<code>1.4.5 Build 20240514 Rel. 36508</code>で動作確認しました。</p>



<h2 class="wp-block-heading">Tapo P105を制御するサンプルコード</h2>



<pre class="wp-block-code"><code>#!/usr/bin/env python3.14

# TP-Link P105 スマートプラグ制御スクリプト
# インストール必要：pip install tapo==0.8.12

import sys
import asyncio
from tapo import ApiClient

async def main(ipaddress, email, password, action):
    # Tapo APIクライアントで認証し、デバイスに接続
    client = ApiClient(email, password)
    device = await client.p100(ipaddress)
    # 指定されたアクションに応じてON/OFF
    if action == "on":
        await device.on()
    elif action == "off":
        await device.off()

# 引数チェック
if len(sys.argv) == 5:
    ipaddress = sys.argv&#91;1]
    email = sys.argv&#91;2]
    password = sys.argv&#91;3]
    action = sys.argv&#91;4]
    asyncio.run(main(ipaddress, email, password, action))
else:
    print('Usage: main.py &lt;IPaddress> &lt;Email> &lt;Password> &lt;"on" or "off">')</code></pre>



<h2 class="wp-block-heading">無事に動作できました！</h2>



<p>無事に動作させることができました。参考になれば幸いです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/3785/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DICOM形式を動画ファイルに変換するには？（血管撮影画像用）</title>
		<link>https://takabus.com/tips/3686/</link>
					<comments>https://takabus.com/tips/3686/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Mon, 01 Sep 2025 12:34:32 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=3686</guid>

					<description><![CDATA[血管撮影の動画が含まれているDICOMから動画を取り出し、汎用の動画ファイルに変換するPythonを紹介します。 フォルダ内にある.dcmファイルを動画ファイル（AVI形式）に一括変換します。DICOM形式から一般的な画 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>血管撮影の動画が含まれているDICOMから動画を取り出し、汎用の動画ファイルに変換するPythonを紹介します。</p>



<p>フォルダ内にある.dcmファイルを動画ファイル（AVI形式）に一括変換します。DICOM形式から一般的な画像ファイル・動画ファイル形式に変換することができます。</p>



<pre class="wp-block-code"><code>import pydicom
import numpy as np
from PIL import Image
import cv2
import os
import argparse
from pathlib import Path
import logging

# ログ設定
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

class DICOMToVideoConverter:
    def __init__(self, output_dir=None):
        """
        DICOM動画変換クラス
        
        Args:
            output_dir (str): 出力ディレクトリ（Noneの場合は入力ファイルと同じ場所）
        """
        self.output_dir = Path(output_dir) if output_dir else None
        if self.output_dir:
            self.output_dir.mkdir(exist_ok=True)
        
    def convert_file_to_video(self, dicom_path):
        """
        単一のDICOMファイルを動画に変換
        
        Args:
            dicom_path (str): DICOMファイルのパス
        """
        try:
            dicom_path = Path(dicom_path)
            ds = pydicom.dcmread(dicom_path)
            
            logger.info(f"変換開始: {dicom_path}")
            logger.info(f"Modality: {getattr(ds, 'Modality', 'Unknown')}")
            logger.info(f"Series Description: {getattr(ds, 'SeriesDescription', 'Unknown')}")
            
            # ピクセルデータが存在するかチェック
            if not hasattr(ds, 'pixel_array'):
                logger.warning(f"ピクセルデータが見つかりません: {dicom_path}")
                return False
                
            pixel_array = ds.pixel_array
            logger.info(f"画像サイズ: {pixel_array.shape}")
            
            # 出力ファイル名を決定
            output_filename = f"{dicom_path.stem}.avi"
            if self.output_dir:
                output_path = self.output_dir / output_filename
            else:
                output_path = dicom_path.parent / output_filename
            
            # データタイプに応じて処理
            if len(pixel_array.shape) == 2:
                # 2D画像（単一フレーム）- 1フレームの動画として保存
                logger.info("2D画像を1フレーム動画として変換")
                self._save_as_video(pixel_array&#91;np.newaxis, :, :], output_path, ds)
                
            elif len(pixel_array.shape) == 3:
                # 3D画像（マルチフレーム/ボリューム）
                if pixel_array.shape&#91;0] &gt; 1:
                    # マルチフレーム - 動画として保存
                    logger.info(f"マルチフレーム動画として変換: {pixel_array.shape&#91;0]}フレーム")
                    self._save_as_video(pixel_array, output_path, ds)
                else:
                    # 単一フレーム - 1フレームの動画として保存
                    logger.info("単一フレームを1フレーム動画として変換")
                    self._save_as_video(pixel_array, output_path, ds)
                    
            elif len(pixel_array.shape) == 4:
                # 4D画像（時系列ボリューム）- 最初の次元をフレームとして扱う
                logger.info(f"4D画像を動画として変換: {pixel_array.shape&#91;0]}フレーム")
                # 4D -&gt; 3D に変換（時間軸を保持、空間軸を統合）
                if pixel_array.shape&#91;1] == 1:
                    # (time, 1, height, width) -&gt; (time, height, width)
                    reshaped_array = pixel_array.squeeze(1)
                else:
                    # (time, slices, height, width) -&gt; 最初のスライスのみ使用
                    reshaped_array = pixel_array&#91;:, 0, :, :]
                self._save_as_video(reshaped_array, output_path, ds)
                
            else:
                logger.error(f"サポートされていない配列次元: {pixel_array.shape}")
                return False
            
            return True
            
        except Exception as e:
            logger.error(f"変換エラー {dicom_path}: {str(e)}")
            return False
    
    def _normalize_pixel_array(self, pixel_array, ds):
        """
        ピクセル配列を0-255の範囲に正規化
        
        Args:
            pixel_array: ピクセル配列
            ds: DICOMデータセット
            
        Returns:
            正規化されたピクセル配列
        """
        # ウィンドウレベルとウィンドウ幅を取得
        window_center = getattr(ds, 'WindowCenter', None)
        window_width = getattr(ds, 'WindowWidth', None)
        
        if window_center is not None and window_width is not None:
            # 複数の値がある場合は最初の値を使用
            if hasattr(window_center, '__iter__'):
                window_center = window_center&#91;0]
            if hasattr(window_width, '__iter__'):
                window_width = window_width&#91;0]
                
            # ウィンドウレベル処理
            min_val = window_center - window_width / 2
            max_val = window_center + window_width / 2
            pixel_array = np.clip(pixel_array, min_val, max_val)
            pixel_array = ((pixel_array - min_val) / (max_val - min_val) * 255).astype(np.uint8)
        else:
            # ウィンドウ情報がない場合は単純な正規化
            pixel_array = pixel_array.astype(np.float64)
            pixel_array = (pixel_array - pixel_array.min()) / (pixel_array.max() - pixel_array.min()) * 255
            pixel_array = pixel_array.astype(np.uint8)
            
        return pixel_array
    
    def _save_as_video(self, pixel_array, output_path, ds):
        """
        ピクセル配列を動画として保存
        
        Args:
            pixel_array: 3Dピクセル配列 (frames, height, width)
            output_path: 出力パス
            ds: DICOMデータセット
        """
        try:
            # フレームレートを決定（デフォルト: 10fps）
            frame_rate = 10
            if hasattr(ds, 'RecommendedDisplayFrameRate'):
                try:
                    frame_rate = float(ds.RecommendedDisplayFrameRate)
                except:
                    pass
            elif hasattr(ds, 'FrameTime'):
                try:
                    frame_rate = 1000.0 / float(ds.FrameTime)  # FrameTimeはミリ秒
                except:
                    pass
            elif hasattr(ds, 'CineRate'):
                try:
                    frame_rate = float(ds.CineRate)
                except:
                    pass
            
            # フレームレートの妥当性チェック
            frame_rate = max(1, min(60, frame_rate))
            
            height, width = pixel_array.shape&#91;1], pixel_array.shape&#91;2]
            
            logger.info(f"動画設定: {pixel_array.shape&#91;0]}フレーム, {width}x{height}, {frame_rate:.1f}fps")
            
            # AVI形式で保存
            fourcc = cv2.VideoWriter_fourcc(*'XVID')
            out = cv2.VideoWriter(str(output_path), fourcc, frame_rate, (width, height), False)
            
            if not out.isOpened():
                logger.error(f"VideoWriter の初期化に失敗しました: {output_path}")
                return
            
            for i in range(pixel_array.shape&#91;0]):
                frame = pixel_array&#91;i]
                normalized_frame = self._normalize_pixel_array(frame, ds)
                out.write(normalized_frame)
            
            out.release()
            
            # ファイルが正常に作成されたかチェック
            if output_path.exists() and output_path.stat().st_size &gt; 0:
                logger.info(f"✓ 動画を保存しました: {output_path}")
            else:
                logger.error(f"✗ 動画ファイルが正常に作成されませんでした: {output_path}")
                
        except Exception as e:
            logger.error(f"動画保存エラー: {str(e)}")
    
    def convert_directory(self, dicom_dir):
        """
        ディレクトリ内のすべての.dcmファイルを動画に変換
        
        Args:
            dicom_dir (str): DICOMファイルが含まれるディレクトリ
        """
        dicom_dir = Path(dicom_dir)
        
        # .dcmファイルを探索
        dcm_files = &#91;]
        
        # 再帰的に.dcmファイルを検索
        for pattern in &#91;'**/*.dcm', '**/*.DCM']:
            dcm_files.extend(dicom_dir.glob(pattern))
        
        # 重複を除去してソート
        dcm_files = sorted(list(set(dcm_files)))
        
        if not dcm_files:
            logger.warning(f".dcmファイルが見つかりません: {dicom_dir}")
            return
        
        logger.info(f"{len(dcm_files)}個の.dcmファイルを発見しました")
        
        # 変換統計
        success_count = 0
        failed_count = 0
        
        for dcm_file in dcm_files:
            logger.info(f"\n&#91;{success_count + failed_count + 1}/{len(dcm_files)}] 変換中: {dcm_file.name}")
            
            if self.convert_file_to_video(dcm_file):
                success_count += 1
            else:
                failed_count += 1
        
        # 結果サマリー
        logger.info(f"\n{'='*60}")
        logger.info(f"変換完了サマリー")
        logger.info(f"{'='*60}")
        logger.info(f"総ファイル数: {len(dcm_files)}")
        logger.info(f"成功: {success_count}")
        logger.info(f"失敗: {failed_count}")
        logger.info(f"成功率: {success_count/len(dcm_files)*100:.1f}%")
        
        if self.output_dir:
            logger.info(f"出力先: {self.output_dir}")
        else:
            logger.info(f"出力先: 各ファイルと同じディレクトリ")

def main():
    parser = argparse.ArgumentParser(description='DICOMファイルを一括でAVI動画に変換')
    parser.add_argument('input_dir', help='DICOMファイルが含まれるディレクトリのパス')
    parser.add_argument('-o', '--output', help='出力ディレクトリ（省略時は入力ファイルと同じ場所）')
    parser.add_argument('-v', '--verbose', action='store_true', help='詳細ログを表示')
    
    args = parser.parse_args()
    
    if args.verbose:
        logging.getLogger().setLevel(logging.DEBUG)
    
    input_dir = Path(args.input_dir)
    
    if not input_dir.exists():
        logger.error(f"指定されたディレクトリが存在しません: {input_dir}")
        return
    
    if not input_dir.is_dir():
        logger.error(f"指定されたパスはディレクトリではありません: {input_dir}")
        return
    
    converter = DICOMToVideoConverter(args.output)
    converter.convert_directory(input_dir)

if __name__ == "__main__":
    # 使用例の表示
    print("=== DICOM一括動画変換プログラム ===")
    print("フォルダ内のすべての.dcmファイルを&#91;元ファイル名].aviに変換します")
    print()
    print("使用方法:")
    print("python dicom_converter.py &lt;DICOMディレクトリ&gt; &#91;-o 出力ディレクトリ] &#91;-v]")
    print()
    print("例:")
    print("python dicom_converter.py ./dicom_folder/")
    print("python dicom_converter.py ./dicom_folder/ -o ./output/ -v")
    print()
    print("特徴:")
    print("- フォルダ内の.dcmファイルを再帰的に検索")
    print("- 各ファイルを個別のAVI動画に変換")
    print("- 2D画像も1フレームの動画として変換")
    print("- マルチフレームDICOMは適切なフレームレートで動画化")
    print("- 出力先未指定時は元ファイルと同じ場所に保存")
    print()
    
    # コマンドライン引数がある場合は実行
    import sys
    if len(sys.argv) &gt; 1:
        main()
    else:
        print("対話式使用例:")
        print("converter = DICOMToVideoConverter('./output/')")
        print("converter.convert_directory('./dicom_folder/')")</code></pre>



<p>使用方法については以下の通り。</p>



<pre class="wp-block-code"><code>=== DICOM一括動画変換プログラム ===
フォルダ内のすべての.dcmファイルを&#91;元ファイル名].aviに変換します        

使用方法:
<strong>python dicom_converter.py &lt;DICOMディレクトリ&gt; &#91;-o 出力ディレクトリ] &#91;-v]</strong>

例:
python dicom_converter.py ./dicom_folder/
python dicom_converter.py ./dicom_folder/ -o ./output/ -v

特徴:
- フォルダ内の.dcmファイルを再帰的に検索
- 各ファイルを個別のAVI動画に変換
- 2D画像も1フレームの動画として変換
- マルチフレームDICOMは適切なフレームレートで動画化
- 出力先未指定時は元ファイルと同じ場所に保存
</code></pre>



<p>学会発表に使えます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/3686/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Selenium】the chromedriver version cannot be discoveredの対処法</title>
		<link>https://takabus.com/tips/3301/</link>
					<comments>https://takabus.com/tips/3301/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 13 Jul 2024 09:54:45 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=3301</guid>

					<description><![CDATA[PythonでSeleniumを使ったプログラムを実行したら、次のようなメッセージが表示されました。 対応するバージョンのChromeDriverがインストールされていないとのこと。 でも、SeleniumManager [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PythonでSeleniumを使ったプログラムを実行したら、次のようなメッセージが表示されました。</p>



<pre class="wp-block-code"><code>C:\Users\aaa\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\common\windows\selenium-manager.exe --browser chrome.
WARN    Error getting version of chromedriver 126. Retrying with chromedriver 125 (attempt 1/5)
WARN    Error getting version of chromedriver 125. Retrying with chromedriver 124 (attempt 2/5)
WARN    Error getting version of chromedriver 124. Retrying with chromedriver 123 (attempt 3/5)
WARN    Error getting version of chromedriver 123. Retrying with chromedriver 122 (attempt 4/5)
WARN    Error getting version of chromedriver 122. Retrying with chromedriver 121 (attempt 5/5)
ERROR   The chromedriver version cannot be discovered</code></pre>



<p>対応するバージョンのChromeDriverがインストールされていないとのこと。</p>



<p>でも、SeleniumManagerを使っているので、自動でインストールされるはず。</p>



<p>こういうときの対処法をご紹介します。</p>



<h2 class="wp-block-heading">対処法：Seleniumをアップデートする</h2>



<p>Seleniumをアップグレードしましょう。</p>



<pre class="wp-block-code"><code>pip install --upgrade selenium</code></pre>



<p>これだけで解決します。</p>



<p>upgrade後に再度プログラムを実行すると、PCにインストールされているChromeに対応した適切なバージョンのChromeDriverを自動的にインストールし、プログラムを実行してくれるようになります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/3301/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】PDFにパスワードをかけるには？大量のPDFを一括保護するスクリプトもご紹介</title>
		<link>https://takabus.com/tips/2286/</link>
					<comments>https://takabus.com/tips/2286/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 25 Nov 2022 07:18:06 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=2286</guid>

					<description><![CDATA[PythonでPDFにパスワードを設定してみましょう。大量のPDFファイルを一括でパスワード保護するスクリプトも紹介しています。]]></description>
										<content:encoded><![CDATA[
<p>PythonでPDFにパスワードを設定してみましょう。大量のPDFファイルを一括でパスワード保護するスクリプトも紹介しています。</p>



<h2 class="wp-block-heading">PyPDF2のインストール</h2>



<p>今回のサンプルではPythonでPDFを扱えるライブラリ「PyPDF2」を使っていきます。</p>




<a rel="noopener" href="https://github.com/py-pdf/PyPDF2" title="GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://opengraph.githubassets.com/288afa9cb38b11e33d3c8b4b7a324a0dae8309b4040393fb229bb85b9eb23287/py-pdf/pypdf" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files</div><div class="blogcard-snippet external-blogcard-snippet">A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files - py-pdf/pypd...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/py-pdf/pypdf" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>pipコマンドでインストールできますので、あらかじめインストールしておきましょう。</p>



<pre class="wp-block-code"><code>pip install PyPDF2</code></pre>



<h2 class="wp-block-heading">PDFをパスワードで保護するには？</h2>



<p>さっそくコードをご紹介します。</p>



<pre class="wp-block-code"><code>import os
from PyPDF2 import PdfReader, PdfWriter

# PDFファイルのパス
filepath="test.pdf"
# パスワード
password="password"

# PDFを読み込む
reader = PdfReader(filepath)
# 新しいPDFを作成する
writer = PdfWriter()

# 既存ファイルからページを取り込む
for page in reader.pages:
    writer.add_page(page)

# パスワードでファイルを暗号化
writer.encrypt(password)

# 暗号化したPDFを保存する
#   元のファイル名に_encryptedをつけたファイル名で保存する
with open(os.path.splitext(os.path.basename(filepath))&#91;0]+"_encrypted.pdf", "wb") as f:
    writer.write(f)</code></pre>



<p>スクリプトの最初でパスワードで保護したいPDFファイルのパスとパスワードを指定します。</p>



<pre class="wp-block-code"><code># PDFファイルのパス
filepath="test.pdf"
# パスワード
password="password"</code></pre>



<p>スクリプトを実行すると、パスワードで保護されたPDFが生成されます。ファイル名はもとのファイル名に「_encrypted」という文字列が付与されたものとなります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="522" height="139" src="https://takabus.com/tips/wp-content/uploads/2022/11/image-16.png" alt="" class="wp-image-2287" srcset="https://takabus.com/tips/wp-content/uploads/2022/11/image-16.png 522w, https://takabus.com/tips/wp-content/uploads/2022/11/image-16-300x80.png 300w" sizes="(max-width: 522px) 100vw, 522px" /><figcaption>生成されたPDFファイルを開こうとすると、パスワードを要求されます。</figcaption></figure>



<h2 class="wp-block-heading">大量のPDFを一気にパスワードで保護する</h2>



<p>複数のPDFファイルを一括でパスワード保護するスクリプトもご紹介しましょう。</p>



<pre class="wp-block-code"><code>import os
import glob
from PyPDF2 import PdfReader, PdfWriter

# PDFファイルのパス
folderpath="C:/Users/user/Desktop/pdf"
# パスワード
password="password"


# ファイルの一覧を取得する
files=glob.glob(folderpath+"/*.pdf")
print(files)

# ファイルごとに処理する
for file in files:
                
    # PDFを読み込む
    reader = PdfReader(file)
    # 新しいPDFを作成する
    writer = PdfWriter()

    # 既存ファイルからページを取り込む
    for page in reader.pages:
        writer.add_page(page)

    # パスワードでファイルを暗号化
    writer.encrypt(password)

    # 暗号化したPDFを保存する
    outpath=os.path.join(folderpath,os.path.splitext(os.path.basename(file))&#91;0])
    with open(outpath+"_encrypted.pdf", "wb") as f:
        writer.write(f)
    print("ファイルを暗号化しました:"+outpath)
    
print("処理終了")</code></pre>



<p>上記スクリプトを実行すると、デスクトップにあるフォルダ（ここでは<code>C:/Users/user/Desktop/pdf</code>）にあるすべてのPDFをパスワードで保護します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="220" height="144" src="https://takabus.com/tips/wp-content/uploads/2022/11/image-17.png" alt="" class="wp-image-2288"/></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/2286/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】PDFのページ数を取得するには？</title>
		<link>https://takabus.com/tips/2283/</link>
					<comments>https://takabus.com/tips/2283/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 25 Nov 2022 06:41:34 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=2283</guid>

					<description><![CDATA[PythonでPDFのページ数を取得する方法をご紹介します。]]></description>
										<content:encoded><![CDATA[
<p>PythonでPDFのページ数を取得する方法をご紹介します。</p>



<h2 class="wp-block-heading">PyPDF2のインストール</h2>



<p>今回のサンプルではPythonでPDFを扱えるライブラリ「PyPDF2」を使っていきます。</p>




<a rel="noopener" href="https://github.com/py-pdf/PyPDF2" title="GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/288afa9cb38b11e33d3c8b4b7a324a0dae8309b4040393fb229bb85b9eb23287/py-pdf/pypdf" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files</div><div class="blogcard-snippet external-blogcard-snippet">A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files - py-pdf/pypd...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/py-pdf/pypdf" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>pipコマンドでインストールできますので、あらかじめインストールしておきましょう。</p>



<pre class="wp-block-code"><code>pip install PyPDF2</code></pre>



<h2 class="wp-block-heading">ページ数を取得するには？</h2>



<p>さっそくPDFのページ数を取得してみましょう。</p>



<pre class="wp-block-code"><code>from PyPDF2 import PdfReader

# PDFを読み込む
reader = PdfReader("sample.pdf")
# ページ数を取得する
print(len(reader.pages))</code></pre>



<p>たった3行です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="694" height="167" src="https://takabus.com/tips/wp-content/uploads/2022/11/image-15.png" alt="" class="wp-image-2284" srcset="https://takabus.com/tips/wp-content/uploads/2022/11/image-15.png 694w, https://takabus.com/tips/wp-content/uploads/2022/11/image-15-300x72.png 300w" sizes="(max-width: 694px) 100vw, 694px" /></figure>



<p>ページ数を取得することができました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/2283/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】PDFのタイトル・作成者を取得するには？</title>
		<link>https://takabus.com/tips/2279/</link>
					<comments>https://takabus.com/tips/2279/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Fri, 25 Nov 2022 06:38:39 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=2279</guid>

					<description><![CDATA[PDFからタイトルや作成者などのメタデータを取得するコードをご紹介します。]]></description>
										<content:encoded><![CDATA[
<p>PDFからタイトルや作成者などのメタデータを取得するコードをご紹介します。</p>



<h2 class="wp-block-heading">PyPDF2のインストール</h2>



<p>今回のサンプルではPythonでPDFを扱えるライブラリ「PyPDF2」を使っていきます。</p>




<a rel="noopener" href="https://github.com/py-pdf/PyPDF2" title="GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/288afa9cb38b11e33d3c8b4b7a324a0dae8309b4040393fb229bb85b9eb23287/py-pdf/pypdf" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files</div><div class="blogcard-snippet external-blogcard-snippet">A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files - py-pdf/pypd...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/py-pdf/pypdf" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>pipコマンドでインストールできますので、あらかじめインストールしておきましょう。</p>



<pre class="wp-block-code"><code>pip install PyPDF2</code></pre>



<h2 class="wp-block-heading">そもそもPDFのメタデータとは？</h2>



<p>PDFにはメタデータを格納することができます。</p>



<p>例えば、PowerPointで作成したPDFには、表題がタイトルとして格納されています。Adobe Acrobat Readerなどのアプリケーションで確認することができます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1007" height="692" src="https://takabus.com/tips/wp-content/uploads/2022/11/AcroRd32_HaCD5TTRf0.png" alt="" class="wp-image-2281" srcset="https://takabus.com/tips/wp-content/uploads/2022/11/AcroRd32_HaCD5TTRf0.png 1007w, https://takabus.com/tips/wp-content/uploads/2022/11/AcroRd32_HaCD5TTRf0-300x206.png 300w, https://takabus.com/tips/wp-content/uploads/2022/11/AcroRd32_HaCD5TTRf0-768x528.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></figure>



<p>今回はPythonでこれらのデータを取得する方法をご紹介します。</p>



<h2 class="wp-block-heading">タイトルを取得するには？</h2>



<p>メタデータからタイトルを取得してみましょう。</p>



<pre class="wp-block-code"><code>from PyPDF2 import PdfReader

# PDFを読み込む
reader = PdfReader("sample.pdf")

# メタデータを取得する
meta = reader.metadata

# タイトルを出力
print(meta.title)
# サブタイトルを出力
print(meta.subject)</code></pre>



<p>上記PDFに対して実行すると、以下のように出力されます。</p>



<pre class="wp-block-code"><code>タイトルはです
None</code></pre>



<h2 class="wp-block-heading">PDFの作成者を取得するには？</h2>



<p>メタデータに含まれている場合は、PDFを作成したユーザー名も取得することができます。</p>



<pre class="wp-block-code"><code>from PyPDF2 import PdfReader

# PDFを読み込む
reader = PdfReader("sample.pdf")

# メタデータを取得する
meta = reader.metadata

# 作成者を出力
print(meta.author)</code></pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/2279/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PythonでPDFからテキストを抽出するには？</title>
		<link>https://takabus.com/tips/2267/</link>
					<comments>https://takabus.com/tips/2267/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Tue, 22 Nov 2022 13:36:57 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=2267</guid>

					<description><![CDATA[PythonでPDFに含まれるテキストを抽出するサンプルコードをご紹介します。]]></description>
										<content:encoded><![CDATA[
<p>PythonでPDFに含まれるテキストを抽出するサンプルコードをご紹介します。</p>



<h2 class="wp-block-heading">PyPDF2のインストール</h2>



<p>今回のサンプルではPythonでPDFを扱えるライブラリ「PyPDF2」を使っていきます。</p>




<a rel="noopener" href="https://github.com/py-pdf/PyPDF2" title="GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/288afa9cb38b11e33d3c8b4b7a324a0dae8309b4040393fb229bb85b9eb23287/py-pdf/pypdf" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - py-pdf/pypdf: A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files</div><div class="blogcard-snippet external-blogcard-snippet">A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files - py-pdf/pypd...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/py-pdf/pypdf" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>pipコマンドでインストールできますので、あらかじめインストールしておきましょう。</p>



<pre class="wp-block-code"><code>pip install PyPDF2</code></pre>



<h2 class="wp-block-heading">とりあえず抽出してみる</h2>



<p>さっそくPyPDF2を使って、PDFファイルからテキストデータを取り出してみます。</p>



<p>ここでは、Pythonスクリプトと同じ階層のディレクトリ（フォルダ）に<em><strong>sample.pdf</strong></em>というPDFファイルがあるとします。</p>



<div data-wp-interactive="" class="wp-block-file"><object data-wp-bind--hidden="!selectors.core.file.hasPdfPreview" hidden class="wp-block-file__embed" data="https://takabus.com/tips/wp-content/uploads/2022/11/sample.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="sample.pdfの埋め込み。の埋め込み。"></object><a id="wp-block-file--media-c11d8c74-5c7c-4410-9990-2b5b20e7a41b" href="https://takabus.com/tips/wp-content/uploads/2022/11/sample.pdf">sample.pdf</a><a href="https://takabus.com/tips/wp-content/uploads/2022/11/sample.pdf" class="wp-block-file__button" download aria-describedby="wp-block-file--media-c11d8c74-5c7c-4410-9990-2b5b20e7a41b">ダウンロード</a></div>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="103" height="76" src="https://takabus.com/tips/wp-content/uploads/2022/11/image-14.png" alt="" class="wp-image-2268"/></figure>



<p><strong>この<em>sample.pdf</em>の1ページ目に含まれるテキストを抽出してみましょう。以下のコードを実行します。</strong></p>



<pre class="wp-block-code"><code>from PyPDF2 import PdfReader

# PDFファイルを読み込む
reader = PdfReader("a.pdf")
# 1ページ目を取得する
page = reader.pages&#91;0]
# ページからテキストを抽出する
print(page.extract_text())</code></pre>



<p>実行すると、以下のように出力されます。</p>



<pre class="wp-block-code"><code>Lorem Ipsum  
"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."  
"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain..."  
What is Lorem Ipsum?  
Lorem Ipsum  is simply dummy text of the printing and typesetting industry. Lorem Ipsum has 
been the industry's standard dummy text ever since the 1500s, when an unknown printer took a 
...以下略</code></pre>



<p>1ページ目の内容がきちんと出力されましたね。</p>



<h2 class="wp-block-heading">ファイル全体のテキストを抽出するには？</h2>



<p>上記のサンプルでは1ページ目に含まれるテキストのみ抽出しました。PyPDF2では、ページごとにテキストを抽出する必要があります。</p>



<p><strong><span class="marker-under">PDFのすべてのページからテキストを抽出するには、以下のようなコードとなります。</span></strong></p>



<pre class="wp-block-code"><code>from PyPDF2 import PdfReader

# PDFファイルを読み込む
reader = PdfReader("sample.pdf")
# 各ページからテキストを抽出する
for page in reader.pages:
    print(page.extract_text())</code></pre>



<p>PDFファイルに含まれるすべてのページからテキストを抽出するには、各ページに対して、順番にテキストの抽出を行う必要があります。</p>



<p>上記のコードを実行すると、すべてのページのテキストを抽出することができます。</p>



<h2 class="wp-block-heading"></h2>



<p>PythonでPDFに含まれるテキストを抽出するサンプルコードをご紹介しました。</p>



<p>PyPDF2を活用すると、仕事で必要なPDF処理をPythonで効率化することができます。ぜひお試しください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/2267/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】字幕（SRT）のタイムコードを一括修正する</title>
		<link>https://takabus.com/tips/2258/</link>
					<comments>https://takabus.com/tips/2258/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Sat, 19 Nov 2022 01:39:12 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=2258</guid>

					<description><![CDATA[字幕ファイル（srt）のタイムコードを一括修正するスクリプトを紹介します。]]></description>
										<content:encoded><![CDATA[
<p>字幕ファイル（srt）のタイムコードを一括修正するスクリプトを紹介します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://takabus.com/tips/wp-content/uploads/2021/09/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Davinci Resolveでは出力される字幕ファイルのタイムコードがずれるバグがあります。Davinci Resolveで出力された字幕ファイルをこのスクリプトで処理することにより、ズレを修正することができます。</p>
</div></div>



<h2 class="wp-block-heading">pysrtのインストール</h2>



<p>Pythonからsrtを取り扱うには、pysrtというライブラリが便利です。</p>




<a rel="noopener" href="https://github.com/byroot/pysrt" title="GitHub - byroot/pysrt: Python parser for SubRip (srt) files" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/f3a6af7196872a8192bba9fe48e42d22dcd7997c6e66c52c425b11dc115861b9/byroot/pysrt" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - byroot/pysrt: Python parser for SubRip (srt) files</div><div class="blogcard-snippet external-blogcard-snippet">Python parser for SubRip (srt) files. Contribute to byroot/pysrt development by creating an account on GitHub.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/byroot/pysrt" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>pysrtを使うと、いともかんたんにsrtファイルの内容を編集することができます。</p>



<pre class="wp-block-code"><code>pip install pysrt</code></pre>



<p>pipでインストールしておきましょう。</p>



<h2 class="wp-block-heading">タイムコードをずらすスクリプト</h2>



<p>タイムコードを一気にずらすにはどうすればよいのでしょうか。</p>



<p>さっそくスクリプトをご紹介しましょう。</p>



<pre class="wp-block-code"><code>import pysrt
import os
import sys

print("python srtshift.py &#91;filepath(.src)] &#91;seconds]")

# ファイルパスを取得する
filepath=os.path.abspath(sys.argv&#91;1])

# コンソールにファイルパスを表示
print('target file：'+filepath)
print('shift time：'+sys.argv&#91;2])
print()

# ファイルを開いて、タイムコードをシフトする
subs = pysrt.open(filepath)
subs.shift(seconds=float(sys.argv&#91;2]))
subs.save(filepath, encoding='utf-8')

# 完了
print('finish!')</code></pre>



<p>第1引数にSRTファイルのパス、第2引数にシフトさせたい秒数を指定して実行すると、SRTファイルのすべてのタイムコードを修正することができます。</p>



<h2 class="wp-block-heading">実行してみる</h2>



<p>Windowsの方はコマンドプロンプト、MacOSの方はターミナルを開いて、以下のコマンドを実行します。</p>



<pre class="wp-block-code"><code>python srtshift.py "ファイルパス" "ずらす秒数"</code></pre>



<p>例えば、3秒遅らせるには以下のようにします。</p>



<pre class="wp-block-code"><code>python srtshift.py "c:\Users\user\Desktop\字幕1.srt" +3</code></pre>



<p>シフトする秒数は、少数で指定することもできます。</p>



<pre class="wp-block-code"><code>python srtshift.py "c:\Users\user\Desktop\字幕1.srt" +3.2</code></pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/2258/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】たった3行！Tweepyで超簡単にツイートしてみよう！</title>
		<link>https://takabus.com/tips/2082/</link>
					<comments>https://takabus.com/tips/2082/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Wed, 16 Nov 2022 08:46:45 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=2082</guid>

					<description><![CDATA[Twitterに自動投稿してくれるPythonコードを制作しましたので、ご紹介します。]]></description>
										<content:encoded><![CDATA[
<p>Twitterに自動投稿してくれるPythonコードを制作しましたので、ご紹介します。</p>



<h2 class="wp-block-heading">ボット制作には<span class="red">Tweepy</span>がおすすめ！</h2>



<p>Pythonからツイートしたいときに便利なライブラリが「<span class="red">Tweepy</span>」です。</p>



<p>Tweepyを使わなくても、ツイートを投稿したり、ほかの人のツイートにリプライしたりすることができますが、<span class="marker-under"><strong>Tweepyを使うことでさらにかんたんにTwitterボットを作成することができます。</strong></span></p>



<pre class="wp-block-code"><code>pip install tweepy</code></pre>



<p>今回もアクセスキーなどの設定を除けば、<span class="red">たった3行</span>で完成するコードとなっています。</p>



<h2 class="wp-block-heading">サンプルコード</h2>



<p>さっそくサンプルコードをご紹介しましょう。</p>



<p>次のコードを実行すると、Twitterに「こんにちは」というツイートが投稿されます。</p>



<pre class="wp-block-code"><code>import tweepy

# Twitter APIのアクセスキー
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''

# Tweetする
api = tweepy.Client(consumer_key=consumer_key, consumer_secret=consumer_secret,
                    access_token=access_token, access_token_secret=access_token_secret)
api.create_tweet(text='こんにちは')</code></pre>



<p>keyやsecretはTwitter APIに登録したときに取得したものを入力してください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-ばすにっきtips wp-block-embed-ばすにっきtips"><div class="wp-block-embed__wrapper">

<a href="https://takabus.com/tips/1894/" title="【2023年版】Twitter APIに登録する全手順を紹介！（スクリーンショット付き）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-160x90.png 160w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-300x169.png 300w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-1024x576.png 1024w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-768x432.png 768w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-1536x864.png 1536w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-120x68.png 120w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-320x180.png 320w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022-374x210.png 374w, https://takabus.com/tips/wp-content/uploads/2022/09/TwitterAPIへの登録方法2022.png 1920w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【2023年版】Twitter APIに登録する全手順を紹介！（スクリーンショット付き）</div><div class="blogcard-snippet internal-blogcard-snippet">ツイッターのボットを作成するには、TwitterAPIに登録する必要があります。Twitter APIの利用に必要なTwitter Developer Portalへの登録から、APIキーの取得までの全手順をスクリーンショット付きで紹介したいと思います。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://takabus.com/tips" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">takabus.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2022.09.16</div></div></div></div></a>
</div></figure>



<p>あとはPythonで上記コードを実行すれば、<span class="red">「こんにちは」</span>とツイートされるはずです。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>実際の応用例としては、あらかじめ投稿したいコードをデータベースに登録しておき、ツイートを自動投稿してくれるようなシステムが考えられます。</p>



<p>cronに登録しておけば、毎日決まった時間帯にPythonからツイートすることもできます。企業の広告ボットなどでよく使われている手法ですね。</p>



<p>ほかにもWordPressの新着記事を自動投稿したり、さまざまな応用法が考えられます。Tweepyを使うと、Twitterボットをいとも簡単に開発できますので、ぜひお試しください！</p>



<div class="wp-block-cocoon-blocks-label-box-1 label-box block-box has-border-color has-light-blue-border-color"><div class="label-box-label block-box-label box-label"><span class="label-box-label-text block-box-label-text box-label-text">開発依頼も承ります！</span></div><div class="label-box-content block-box-content box-content">
<p>Twitterボットの開発依頼も承っております。</p>



<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-orange-color">AWS</mark>等のクラウドでの運用も可能です。<span class="red">お気軽にお問い合わせください！</span></p>



<iframe loading="lazy" src="https://docs.google.com/forms/d/e/1FAIpQLScBXnoKLVRb88YhwMEbj0NzV4ZVOJoHc5HyZ7X1unlCNaWDOQ/viewform?embedded=true" width="640" height="1000" frameborder="0" marginheight="0" marginwidth="0">読み込んでいます…</iframe>



<div class="wp-block-cocoon-blocks-button-1 button-block"><a rel="noopener" href="https://docs.google.com/forms/d/e/1FAIpQLScBXnoKLVRb88YhwMEbj0NzV4ZVOJoHc5HyZ7X1unlCNaWDOQ/viewform?usp=sf_link" class="btn btn-s has-background has-light-blue-background-color" target="_blank">新しいタブで開く</a></div>
</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/2082/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】QRコードを生成するには？一括で生成するサンプルコードもご紹介</title>
		<link>https://takabus.com/tips/1360/</link>
					<comments>https://takabus.com/tips/1360/#respond</comments>
		
		<dc:creator><![CDATA[ばすにっきTips]]></dc:creator>
		<pubDate>Wed, 04 May 2022 07:55:25 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[qrcode]]></category>
		<guid isPermaLink="false">https://takabus.com/tips/?p=1360</guid>

					<description><![CDATA[PythonでQRコードを生成する方法をまとめました。リストから大量のQRコードを一括作成するサンプルコードも紹介しています。]]></description>
										<content:encoded><![CDATA[
<p>PythonでQRコードを生成する方法をまとめました。リストから大量のQRコードを一括作成するサンプルコードも紹介しています。</p>



<h2 class="wp-block-heading">PythonでQRコードを生成するには？</h2>



<p><strong><span class="marker-under">PythonでQRコードを生成するには、<span class="bold-red">qrcode</span>というライブラリがおすすめです。</span></strong></p>




<a rel="noopener" href="https://pypi.org/project/qrcode/" title="qrcode" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://pypi.org/static/images/twitter.abaf4b19.webp" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">qrcode</div><div class="blogcard-snippet external-blogcard-snippet">QR Code image generator</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://pypi.org/project/qrcode/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">pypi.org</div></div></div></div></a>



<p>qrcodeライブラリを使用することで、いともかんたんにQRコードを生成することができます。<span class="red">わずか数行</span>のスクリプトだけで任意の文字列のQRコードを生成できます。</p>



<p>qrcodeライブラリのインストールはpipコマンドで行なえますので、あらかじめインストールしておきましょう。</p>



<pre class="wp-block-code"><code>pip install qrcode&#91;pil]</code></pre>



<p>QRコードを作成してみます。</p>



<pre class="wp-block-code"><code>import qrcode
img = qrcode.make('QRコードです！')

img.save("qr.png")</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="347" height="346" src="https://takabus.com/tips/wp-content/uploads/2022/05/image-4.png" alt="" class="wp-image-1361" srcset="https://takabus.com/tips/wp-content/uploads/2022/05/image-4.png 347w, https://takabus.com/tips/wp-content/uploads/2022/05/image-4-300x300.png 300w, https://takabus.com/tips/wp-content/uploads/2022/05/image-4-150x150.png 150w, https://takabus.com/tips/wp-content/uploads/2022/05/image-4-100x100.png 100w" sizes="(max-width: 347px) 100vw, 347px" /></figure>



<p>生成完了！たった3行のスクリプトでQRコードを生成できました！</p>



<p>ちなみにサンプルのように<strong><span class="bold-red">日本語を含むQRコードの生成</span>にも対応しています。</strong>データはUTF-8でエンコードされているため、スマホのQRコードアプリはもちろん、OpenCVのQRCodeDecoderでも読み取ることができます。</p>



<h2 class="wp-block-heading">サイズやバージョン・色を指定することもできる！</h2>



<p>QRCodeクラスを使用すると、<span class="marker-under"><strong>生成するQRコードのサイズやバージョン・背景色</strong></span>なども指定することができます。</p>



<pre class="wp-block-code"><code>import qrcode

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=3,
    border=4,
)
qr.add_data("QRコードです！")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")</code></pre>



<p>背景には単色だけではなく、<span class="marker-under"><strong>任意の画像を埋め込むこともできます。</strong></span></p>



<pre class="wp-block-code"><code>qr.make_image(image_factory=StyledPilImage, embeded_image_path="/path/to/image.png")</code></pre>



<p>詳細は公式ドキュメントをご参照ください。</p>




<a rel="noopener" href="https://pypi.org/project/qrcode/" title="qrcode" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://pypi.org/static/images/twitter.abaf4b19.webp" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">qrcode</div><div class="blogcard-snippet external-blogcard-snippet">QR Code image generator</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://pypi.org/project/qrcode/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">pypi.org</div></div></div></div></a>



<h2 class="wp-block-heading">QRコードを一括生成する</h2>



<p>リスト（配列）にセットした値からQRコードを一括生成するサンプルをご紹介します。</p>



<pre class="wp-block-code"><code>import qrcode

# 生成したいQRコードの文字列
codes=&#91;
    "あ","い","う"
]

# QRコードを一括作成
for i in range(len(codes)):
    img = qrcode.make(codes&#91;i])
    img.save(codes&#91;i]+".png")</code></pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://takabus.com/tips/1360/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
